gridview中的setImageBitmap不会缩放图像以适合

时间:2015-03-12 02:44:12

标签: android gridview bitmap imageview

注意:此问题仅发生在gridview中,如果您在单个图像视图中显示setimagebitmap,则效果很好。

看下面的图片,左边的图片是我想要的,右边的图片就是我得到的。

enter image description here

唯一的区别是我设置图像的方式,如果我将图像设置如下,我得到正确的结果(左上图)。

holder.image.setImageResource(imagesArray.get(position));

但如果我用下面的位图设置图像,图像不按我的要求缩放(右上图)

holder.imageView.setImageBitmap(bitmap);

为什么我将图像设置为位图而不是drawable? 因为我的图像是加密的,我需要在加载到imageview之前解密它们。基本步骤是:

  1. 将图像分解为字节arrya。
  2. 从字节创建位图。
  3. 将位图加载到imageview中。
  4. 注意,问题不是由解密引起的,我在没有解密的情况下测试了正常的图像,它也不起作用。

    这是代码

    GridViewActivity。

    public class GridViewActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_gridview);
    
            GridView gridView = (GridView)findViewById(R.id.grid_view);
            ImageAdapter imageAdapter = ImageAdapter.getInstance();
            imageAdapter.setContext(this);
            gridView.setAdapter(imageAdapter);
    
            for (int i = 0; i < 50; i++) {
                int resourceId = getResources().getIdentifier("myimage", "drawable", getPackageName());
                imageAdapter.imagesArray.add(resourceId);
            }
        }
    }
    

    ImageAdapter

    public class ImageAdapter extends BaseAdapter {
        private static ImageAdapter imageAdapter = null;
        private Bitmap bitmap;
        private Context mContext;
        public ArrayList<Integer> imagesArray = new ArrayList<Integer>();
    
        private ImageAdapter() {
        }
    
        public static ImageAdapter getInstance() {
            if (imageAdapter == null) {
                imageAdapter = new ImageAdapter();
            }
    
            return imageAdapter;
        }
    
        public void setContext(Context context) {
            mContext = context;
        }
    
        @Override
        public int getCount() {
            return imagesArray.size();
        }
    
        @Override
        public Object getItem(int position) {
            return imagesArray.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View row = convertView;
            ViewHolder holder;
    
            if (row == null) {
                LayoutInflater inflater = ((Activity)mContext).getLayoutInflater();
                row = inflater.inflate(R.layout.row_grid, parent, false);
                holder = new ViewHolder();
                holder.imageView = (ImageView)row.findViewById(R.id.image);
                row.setTag(holder);
            }
            else {
                holder = (ViewHolder)row.getTag();
            }
    
            // Create bitmap from image in assets folder.
            String imageFileName = "myimage.jpg";
            AssetManager assetMgr = mContext.getAssets();
            try {
                InputStream fis = assetMgr.open(imageFileName);
                bitmap = BitmapFactory.decodeStream(fis);
            }
            catch (Exception ex) {
                Log.i("zdd", ex.getLocalizedMessage());
            }
    
            holder.imageView.setImageBitmap(bitmap);
            //holder.image.setImageResource(imagesArray.get(position));
    
            return row;
        }
    
        static class ViewHolder {
            ImageView imageView;
        }
    }
    

    SquareImageView。

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

    这是布局

    activity_gridview.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
        <GridView xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/grid_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#7f7f7f"
            android:numColumns="4"
            android:horizontalSpacing="2dp"
            android:verticalSpacing="2dp"
            android:gravity="center"
            android:stretchMode="columnWidth"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true">
        </GridView>
    </RelativeLayout>
    

    row_grid.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="5dp"
        android:background="#ffffff">
        <com.jiyuzhai.setimagebitmaptest.SquareImageView
            android:id="@+id/image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"/>
    </LinearLayout>
    

2 个答案:

答案 0 :(得分:3)

尝试将行项目的父级大小更改为“match_parent”。

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp"
android:background="#ffffff">
<com.jiyuzhai.setimagebitmaptest.SquareImageView
    android:id="@+id/image"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerCrop"/>
</LinearLayout>

答案 1 :(得分:0)

尝试删除&#34;填充&#34;线性布局的属性(或将其设置为0dp)并在SquareImageView中将scaleType设置为fitXY。