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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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_
    android:layout_
 >
<GridView
    android:id="@+id/gridView1"
    android:layout_
    android:layout_
    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_
  android:layout_
  android:background="#000">
<RelativeLayout 
   android:layout_
   android:layout_>
<ImageView
    android:id="@+id/imageView1"
    android:layout_
    android:layout_
    android:layout_alignParentTop="true"
    android:layout_marginTop="20dp"
    android:layout_marginLeft="30dp"
    android:src="@drawable/image1" />
<ImageView
    android:id="@+id/imageView2"
    android:layout_
    android:layout_
    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_
    android:layout_
    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_
    android:layout_
    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

【讨论】:

你能不能再给点别的方法!!图像按角度裁剪@nirmal raghavan 这段代码会泄露内存,参考***.com/questions/12159852/…【参考方案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());

【讨论】:

以上是关于如何在 android 中使用图像制作自定义网格?的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Composer 自定义网格模板上显示自定义字段图像

具有自定义网格视图的 AsyncTask

如何使用图像和文本制作自定义 UIButton?

如何在 Django 中使用 static_url 制作自定义图像路径?

学会使用Android Studio网格布局制作计算器界面

如何在android中使用相机捕获自定义图像大小?