Android:在gridlayout或gridview中创建具有动态大小的网格 [英] Android: Create grid with dynamic size in gridlayout or gridview
问题描述
我打算制作网格基础应用程序,其中网格的数量将根据用户的点击而改变。网格模式: - 2 * 2,4 * 4 ... [比如,用户点击正确的网格,然后网格数量增加]。我能够制作网格,但它不适合布局。所以,如何改变用户点击的网格数量,以及如何动态地设置网格的大小。
这里我附加了我想要实现的图像。
当用户点击不同颜色网格时,网格数量会增加 第二张图片。$ b 图片:1
图片:2
最后,我得到了我的问题的答案:
这里需要把SquareImageView对于imageview并以编程方式设置gridview的列,现在看下面的代码:
$ b SquareImageView.java
public class SquareImageView扩展ImageView {
public SquareImageView(上下文上下文){
super(context);
public SquareImageView(Context context,AttributeSet attrs){
super(context,attrs);
public SquareImageView(Context context,AttributeSet attrs,int defStyle){
super(context,attrs,defStyle);
$ b @Override
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
setMeasuredDimension(getMeasuredWidth(),getMeasuredWidth()); //对齐到
//宽度
}
}
为视图充气机创建Custome适配器,
layout.xml
$ b
<?xml version =1.0encoding =utf-8?>
将LinearLayout中的xmlns:机器人= http://schemas.android.com/apk/res/android
机器人:layout_width = match_parent
机器人:layout_height = match_parent
android:orientation =vertical>
将com.example.SquareImageView
机器人:ID = @ + ID / image_grid
机器人:layout_width = match_parent
机器人:layout_height = match_parent >
< /com.example.SquareImageView>
< / LinearLayout>
MainActivity.java
public class MainActivity extends Activity implements OnClickListener {
int counter = 1;
CustomGrid适配器;
static int colum = 2;
公共静态GridView gridview;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adapter = new CustomGrid(MainActivity.this);
gridview =(GridView)findViewById(R.id.gridview);
gridview.setNumColumns(2);
gridview.setAdapter(adapter);
}
公共类CustomGrid扩展BaseAdapter {
private Context mContext;
CustomGrid adgg;
int mNumColumns = 2;
private随机rand = new Random();
GridView gg;
int color = Color.argb(255,rand.nextInt(256),rand.nextInt(256),rand.nextInt(256));
float alfa = 0.1f;
int rand_ind = rand.nextInt((2 * 2) - 0)+ 0;
public CustomGrid(Context c){
mContext = c;
// this.Imageid = Imageid;
// this.web = web;
}
@Override
public int getCount(){
// TODO自动生成的方法存根
返回mNumColumns * mNumColumns;
}
@Override
public Object getItem(int position){
// TODO自动生成的方法存根
返回null;
}
@Override
public long getItemId(int position){
// TODO自动生成的方法存根
return 0;
$ b @Override
public View getView(final int position,View convertView,ViewGroup parent){
// TODO自动生成的方法存根
查看gridView;
LayoutInflater inflater =(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View grid = new View(mContext);
grid = inflater.inflate(R.layout.layout,null);
final查看imageView =(ImageView)grid.findViewById(R.id.image_grid);
if(convertView == null){
if(position == rand_ind){
imageView.setBackgroundColor(getColorWithAlpha(color,alfa));
} else {
imageView.setBackgroundColor(color);
}
} else {
grid =(View)convertView;
$ b $ grid.setOnClickListener(new OnClickListener(){
$ b $ @Override
public void onClick(View v){
if(position == rand_ind){
//如果条件发生,正确的位置点击时间..........
if(counter == 2){
mNumColumns = mNumColumns +1;
alfa = alfa + 0.1f;
} else if(counter == 6){
mNumColumns = mNumColumns + 1;
的阿尔法=阿尔法+ 0.08f;
}否则如果(计数器== 8){
mNumColumns = mNumColumns + 1;
的阿尔法=阿尔法+ 0.1 f;
} else if(counter == 12){
mNumColumns = mNumColumns + 1;
alfa = alfa + 0.1f;
} else if(计数器== 14){
mNumColumns = mNumColumns + 1;
alfa = alfa + 0.1f;
} else if(counter == 16){
mNumColumns = mNumColumns + 1;
alfa = alfa + 0.1f;
} else if(counter == 18){
mNumColumns = mNumColumns + 1;
alfa = alfa + 0.05f;
} else if(counter> = 18){
// mNumColumns = mNumColumns + 1;
alfa = 0.8f;
}
gridview.setNumColumns(mNumColumns);
gridview.setAdapter(adapter);
adapter.notifyDataSetChanged();
rand_ind = rand.nextInt((mNumColumns * mNumColumns) - 0)+ 0;
}其他{
//这里代表点击点击............ whem点击
//在时间geanarate这个代码.........
}
}
});
返回网格;
}
public int getColorWithAlpha(int color,float ratio){
int newColor = 0;
int alpha = Math.round(Color.alpha(color)* ratio);
int r = Color.red(color);
int g = Color.green(color);
int b = Color.blue(color);
newColor = Color.argb(alpha,r,g,b);
返回newColor;
}
}
@Override
public void onClick(View v){
}
}
我希望这个答案对任何一个都有帮助。
I am planning to make grid base application in which number of grids will change according to user's click. grid pattern:- 2*2 , 4*4 ... [like, user will click on correct grid then number of grid will increase]. I cn able to make grid but it is not fit in layout. so, how can i change the number of grid on user's click and how can i set size of grid dynamically.
Here i have attached the image which i want to achieve .
When user click on different color grid, Number of grid will increase like second image.
Image : 1
Image : 2
Number of grid increased on user's click.
Finally i got answer of My question:
Here need to take SquareImageView for imageview and programatically set column of gridview, now see below code:
SquareImageView.java
public class SquareImageView extends ImageView {
public SquareImageView(Context context) {
super(context);
}
public SquareImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquareImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); // Snap to
// width
}
}
Create Custome adapter for view inflator,
layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.example.SquareImageView
android:id="@+id/image_grid"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.example.SquareImageView>
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity implements OnClickListener {
int counter = 1;
CustomGrid adapter;
static int colum = 2;
public static GridView gridview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adapter = new CustomGrid(MainActivity.this);
gridview = (GridView) findViewById(R.id.gridview);
gridview.setNumColumns(2);
gridview.setAdapter(adapter);
}
public class CustomGrid extends BaseAdapter {
private Context mContext;
CustomGrid adgg;
int mNumColumns = 2;
private Random rand = new Random();
GridView gg;
int color = Color.argb(255, rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
float alfa = 0.1f;
int rand_ind = rand.nextInt((2 * 2) - 0) + 0;
public CustomGrid(Context c) {
mContext = c;
// this.Imageid = Imageid;
// this.web = web;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mNumColumns * mNumColumns;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View gridView;
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View grid = new View(mContext);
grid = inflater.inflate(R.layout.layout, null);
final View imageView = (ImageView) grid.findViewById(R.id.image_grid);
if (convertView == null) {
if (position == rand_ind) {
imageView.setBackgroundColor(getColorWithAlpha(color, alfa));
} else {
imageView.setBackgroundColor(color);
}
} else {
grid = (View) convertView;
}
grid.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (position == rand_ind) {
// Correct postion click time if condition occur..........
if (counter == 2) {
mNumColumns = mNumColumns + 1;
alfa = alfa + 0.1f;
} else if (counter == 6) {
mNumColumns = mNumColumns + 1;
alfa = alfa + 0.08f;
} else if (counter == 8) {
mNumColumns = mNumColumns + 1;
alfa = alfa + 0.1f;
} else if (counter == 12) {
mNumColumns = mNumColumns + 1;
alfa = alfa + 0.1f;
} else if (counter == 14) {
mNumColumns = mNumColumns + 1;
alfa = alfa + 0.1f;
} else if (counter == 16) {
mNumColumns = mNumColumns + 1;
alfa = alfa + 0.1f;
} else if (counter == 18) {
mNumColumns = mNumColumns + 1;
alfa = alfa + 0.05f;
} else if (counter >= 18) {
// mNumColumns = mNumColumns + 1;
alfa = 0.8f;
}
gridview.setNumColumns(mNumColumns);
gridview.setAdapter(adapter);
adapter.notifyDataSetChanged();
rand_ind = rand.nextInt((mNumColumns * mNumColumns) - 0) + 0;
} else {
// Here code for nagative click............ whem click
// nagative at time geanarate this code.........
}
}
});
return grid;
}
public int getColorWithAlpha(int color, float ratio) {
int newColor = 0;
int alpha = Math.round(Color.alpha(color) * ratio);
int r = Color.red(color);
int g = Color.green(color);
int b = Color.blue(color);
newColor = Color.argb(alpha, r, g, b);
return newColor;
}
}
@Override
public void onClick(View v) {
}
}
I hope this answer help full to any one.
这篇关于Android:在gridlayout或gridview中创建具有动态大小的网格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!