如何在android中使用图像制作自定义网格?

如何在android中使用图像制作自定义网格?,android,android-gallery,android-gridview,android-gridlayout,Android,Android Gallery,Android Gridview,Android Gridlayout,我想制作一个带有图像的自定义网格,我们通常在安卓手机上看到这些图像 我已经找了几个小时了。但运气不好,最后我想问一个问题。有人能建议我如何实现这种网格视图吗。或者我需要遵循任何其他方法吗?为网格项创建一个带有3个ImageView的FrameLayout。然后在BaseAdapter类中使用以下代码旋转ImageView Matrix matrix=new Matrix(); imageView.setScaleType(ScaleType.MATRIX); //required matr

我想制作一个带有图像的
自定义网格
,我们通常在安卓手机上看到这些图像


我已经找了几个小时了。但运气不好,最后我想问一个问题。有人能建议我如何实现这种网格视图吗。或者我需要遵循任何其他方法吗?

为网格项创建一个带有3个
ImageView
FrameLayout
。然后在
BaseAdapter
类中使用以下代码旋转
ImageView

Matrix matrix=new Matrix();
imageView.setScaleType(ScaleType.MATRIX);   //required
matrix.postRotate((float) angle, pivX, pivY);
imagView.setImageMatrix(matrix);

添加必要的边距以分隔
ImageView

查看位于源代码中的
ImageBlock
类。这些
ImageBlock
s被管理并放置在
GridViewSpecial
s中。

请参见main.xmlgriditem.xml的代码。我们只需根据已设置的旋转设置imageview和边距的旋转

重要提示

如果您的min SDK版本为11,则使用属性android:rotation=“20”bcz,它从API级别11开始就可用,因此如果您想运行比适配器类中描述的轮换代码更低的版本

假设我有固定和图像视图大小100dp*100dp,如果我设置旋转

android:rotation="20" 
很明显,我们的图像将在栅格视图中从底部和顶部切割,因此根据旋转设置其边距

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
 >
<GridView
    android:id="@+id/gridView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:horizontalSpacing="10dp"
    android:numColumns="auto_fit">
</GridView>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#000">
<RelativeLayout 
   android:layout_width="match_parent"
   android:layout_height="150dp">
<ImageView
    android:id="@+id/imageView1"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_alignParentTop="true"
    android:layout_marginTop="20dp"
    android:layout_marginLeft="30dp"
    android:src="@drawable/image1" />
<ImageView
    android:id="@+id/imageView2"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="40dp"
    android:layout_marginTop="20dp"
    android:src="@drawable/image2" />
<ImageView
    android:id="@+id/imageView3"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="50dp"
    android:layout_marginTop="20dp"
    android:src="@drawable/image3" />
<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Large Text"
    android:textStyle="bold"
    android:textColor="#fff"
     />
</RelativeLayout>
</RelativeLayout>

griditem.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
 >
<GridView
    android:id="@+id/gridView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:horizontalSpacing="10dp"
    android:numColumns="auto_fit">
</GridView>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#000">
<RelativeLayout 
   android:layout_width="match_parent"
   android:layout_height="150dp">
<ImageView
    android:id="@+id/imageView1"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_alignParentTop="true"
    android:layout_marginTop="20dp"
    android:layout_marginLeft="30dp"
    android:src="@drawable/image1" />
<ImageView
    android:id="@+id/imageView2"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="40dp"
    android:layout_marginTop="20dp"
    android:src="@drawable/image2" />
<ImageView
    android:id="@+id/imageView3"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="50dp"
    android:layout_marginTop="20dp"
    android:src="@drawable/image3" />
<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Large Text"
    android:textStyle="bold"
    android:textColor="#fff"
     />
</RelativeLayout>
</RelativeLayout>

main活动

 import android.annotation.TargetApi;
 import android.app.Activity;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Matrix;
 import android.os.Build;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 import android.widget.GridView;
 import android.widget.ImageView;
 import android.widget.TextView;


 @TargetApi(Build.VERSION_CODES.HONEYCOMB)
 public class MainActivity extends Activity{
String[] logtag=new String[]{"Log.e","Log.d","Log.i"};
GridView gv;
GridAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    gv=(GridView)findViewById(R.id.gridView1);
    adapter=new GridAdapter(this);
    gv.setAdapter(adapter);


}
class GridAdapter extends BaseAdapter{
    LayoutInflater lf;
    Context context;

    public  GridAdapter(MainActivity activity) {
        // TODO Auto-generated method stub
        context=activity;
        lf=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return logtag.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder viewHolder;
        if(convertView==null){
            viewHolder=new ViewHolder();
            convertView=lf.inflate(R.layout.griditem, null);
            viewHolder.image1=(ImageView)convertView.findViewById(R.id.imageView1);
            viewHolder.image2=(ImageView)convertView.findViewById(R.id.imageView2);
            viewHolder.image3=(ImageView)convertView.findViewById(R.id.imageView3);
            viewHolder.text=(TextView)convertView.findViewById(R.id.textView1);
            convertView.setTag(viewHolder);
        }else{
            viewHolder=(ViewHolder) convertView.getTag();
        }
        if(android.os.Build.VERSION.SDK_INT < 11){
        RotateBitmap(viewHolder.image1,R.drawable.image1);
        RotateBitmap(viewHolder.image2,R.drawable.image2);
        RotateBitmap(viewHolder.image3,R.drawable.image3);
        }else{
            viewHolder.image1.setRotation(20);
            viewHolder.image2.setRotation(20);
            viewHolder.image3.setRotation(20);
        }
        viewHolder.text.setText(logtag[position]);
        return convertView;
    }
    class ViewHolder{
        ImageView image1;
        ImageView image2;
        ImageView image3;
        TextView text;
    }
    public void RotateBitmap(ImageView imageView, int imageid){
        Bitmap myImg = BitmapFactory.decodeResource(getResources(),imageid);
        Matrix matrix = new Matrix();
        matrix.postRotate(20);
        Bitmap rotated = Bitmap.createBitmap(myImg, 0, 0, myImg.getWidth(), myImg.getHeight(),matrix, true);
        imageView.setImageBitmap(rotated);
    }
}
}
导入android.annotation.TargetApi;
导入android.app.Activity;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.Matrix;
导入android.os.Build;
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.GridView;
导入android.widget.ImageView;
导入android.widget.TextView;
@TargetApi(构建版本代码蜂窝)
公共类MainActivity扩展了活动{
字符串[]logtag=新字符串[]{“Log.e”、“Log.d”、“Log.i”};
GridView gv;
网格适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
gv=(GridView)findViewById(R.id.gridView1);
适配器=新的GridAdapter(此);
gv.设置适配器(适配器);
}
类GridAdapter扩展了BaseAdapter{
拉平机lf;
语境;
公共GridAdapter(MainActivity活动){
//TODO自动生成的方法存根
上下文=活动;
lf=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回logtag.length;
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
持票人持票人;
if(convertView==null){
viewHolder=新的viewHolder();
convertView=lf.充气(R.layout.griditem,空);
viewHolder.image1=(ImageView)convertView.findViewById(R.id.imageView1);
viewHolder.image2=(ImageView)convertView.findViewById(R.id.imageView2);
viewHolder.image3=(ImageView)convertView.findViewById(R.id.imageView3);
viewHolder.text=(TextView)convertView.findViewById(R.id.textView1);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
if(android.os.Build.VERSION.SDK_INT<11){
旋转位图(viewHolder.image1,R.drawable.image1);
旋转位图(viewHolder.image2,R.drawable.image2);
旋转位图(viewHolder.image3,R.drawable.image3);
}否则{
viewHolder.image1.setRotation(20);
viewHolder.image2.setRotation(20);
viewHolder.image3.setRotation(20);
}
viewHolder.text.setText(logtag[position]);
返回视图;
}
类视图持有者{
图像视图图像1;
图像视图图像2;
图像视图图像3;
文本查看文本;
}
public void RotateBitmap(ImageView-ImageView,int-imageid){
位图myImg=BitmapFactory.decodeResource(getResources(),imageid);
矩阵=新矩阵();
矩阵旋转后(20);
位图旋转=Bitmap.createBitmap(myImg,0,0,myImg.getWidth(),myImg.getHeight(),matrix,true);
设置图像位图(旋转);
}
}
}

您可以使用以下代码从中心点旋转图像

Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, config);
Canvas canvas = new Canvas(targetBitmap);
Matrix matrix = new Matrix();
matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2);
canvas.drawBitmap(source, matrix, new Paint());

你能不能再给点别的办法!!图像是根据angle@nirmal Raghava裁剪的。此代码可能会泄漏内存,请参阅