如何使用android中的图像定制网格?

我想制作一个custom grid图片,我们通常在Android手机上看到图片

在这里输入图像说明

我一直在寻找它几个小时。 但没有运气有利,最后我在这里试图提问。 有人可以请build议我如何实现这种gridview。 还是我需要遵循其他方法?

Solutions Collecting From Web of "如何使用android中的图像定制网格?"

在这里输入图像说明 请参阅main.xmlgriditem.xml的代码,我们必须根据我们设置的旋转设置imageview和margin的旋转。

重要的提示

如果你最小的SDK版本是11比使用属性 android:rotation =“20” bcz它是可用的,因为API级别11,所以如果你想运行它的低版本比使用适配器类中描述的旋转代码

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

 android:rotation="20" 

显然我们的图像将从网格视图的底部和顶部减less,因此根据旋转设置边距。

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> 

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" 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> 

主要活动

  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); } } } 

创build一个FrameLayout与3 ImageView网格项目。 然后在BaseAdapter类中使用以下代码来旋转ImageView

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

添加必要的边距来分隔ImageView

看一下位于Android ImageGallery项目源代码中的ImageBlock类。 这些ImageBlock被pipe理并放置到GridViewSpecial

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

 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());