【问题标题】:How to make a custom grid with images in android ?如何在 android 中使用图像制作自定义网格?
【发布时间】:2013-01-24 00:21:09
【问题描述】:

我想制作一个custom grid,其中包含我们通常在 Android 手机中的图库中看到的图片

我已经搜索了几个小时。但是没有运气,最后我试图在这里提问。有人可以建议我如何实现这种网格视图。还是我需要遵循任何其他方法?

【问题讨论】:

    标签: android android-gallery android-gridview android-gridlayout


    【解决方案1】:

    查看 ma​​in.xmlgriditem.xml 的代码,我们只需根据我们设置的旋转设置 imageview 的旋转和边距。

    重要提示

    如果你的最低 SDK 版本是 11 而不是使用属性 android:rotation="20" bcz 它从 API 级别 11 开始可用,所以如果你想运行它比使用更低的版本适配器类中描述的旋转代码

    假设我已经修复了 ImageView 大小为 100dp*100dp 并且如果我设置了 Rotation by

    android:rotation="20" 
    

    很明显,我们的图像会在网格视图中从底部和顶部切开,所以根据旋转设置它的边距。

    ma​​in.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>
    

    MainActivity

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

    【讨论】:

      【解决方案2】:

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

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

      添加必要的边距以分隔ImageView

      【讨论】:

      【解决方案3】:

      查看位于Android ImageGallery project 源代码中的ImageBlock 类。这些ImageBlocks 被管理并放入GridViewSpecials。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-17
          • 1970-01-01
          • 1970-01-01
          • 2021-06-19
          • 1970-01-01
          相关资源
          最近更新 更多