微信仿朋友圈添加图片
问题:
- 添加过多图片时,会出现OOM。
- 如何动态修改图片展示栏的高度。
- 加号如何伴随图片的增加而后移。
- 如何保证最多添加照片为9张。
添加过多图片时,会出现OOM
出现第一种情况的原因很简单,就是随着我们手机的像素越来越高,图片的大小也越来越大,我们普通的机拍出来照片至少也有1~2M,更不说像素高的手机。而对于一个安卓应用来说,由于手机设备的限制,一般应用使用的RAM不能超过某个设定值,不同产商默认值不太一样,一般常见的有16M,24M,32M,48M。所以一个Activity中加载几张高清原图,就会报Out Of Memory 错误,也就是所谓的OOM错误。所以知道了这个问题之后我们就很容易解决了,我们就可以先将图片压缩,然后再使用ImageView加载压缩后的图片即可
如何动态修改图片展示栏的高度
如何动态修改图片展示栏的高度,首先我说一下我是使用GridView来实现图片栏的展示,所以我们可以在第一次加载GridView时可以获取到下图的参数,大家看图会容易理解一点。
- 我们的照片如果只有一栏,则GridView的高度不变
- 如果照片有两栏,则高度设置为gridViewH * 2 - (gridViewH - imageViewH) / 2
- 如果有三栏,则GrideView的高度设置为gridViewH * 3 - (gridViewH - imageViewH)
加权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
activity_main.xml:
?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:background="#F3F6F8" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:background="#0080FF" android:layout_width="match_parent" android:layout_height="35dp"> <TextView android:layout_weight="1" android:layout_marginLeft="5dp" android:id="@+id/tv_fanhui" android:text="返回" android:textColor="#fff" android:textSize="25sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_weight="0.1" android:id="@+id/tv_fabu" android:text="发布" android:textColor="#fff" android:textSize="25sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <ImageView android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="2dp" android:src="#E4E3E3" /> <EditText android:id="@+id/content_et" android:layout_width="fill_parent" android:layout_height="120dp" android:background="#FFFFFF" android:gravity="top" android:hint="随手说出你此刻的心声..." android:maxLength="500" android:padding="5dp" android:singleLine="false" android:textColor="#000000" android:textSize="20sp" /> <ImageView android:layout_width="match_parent" android:layout_height="1dp" android:src="#E4E3E3" /> <ImageView android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="10dp" android:src="#E4E3E3" /> <GridView android:id="@+id/gridView1" android:layout_width="fill_parent" android:layout_height="100dp" android:background="#FFFFFF" android:columnWidth="90dp" android:gravity="center" android:horizontalSpacing="5dp" android:numColumns="4" android:padding="10dp" android:stretchMode="columnWidth" android:verticalSpacing="5dp" > </GridView> <ImageView android:layout_width="match_parent" android:layout_height="1dp" android:src="#E4E3E3" /> <TextView android:id="@+id/tv_weizhi" android:layout_margin="20dp" android:text="所在位置" android:layout_marginLeft="15dp" android:textSize="20sp" android:drawablePadding="15dp" android:drawableLeft="@drawable/a_a" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_haoyou" android:padding="10dp" android:text="谁可以看" android:layout_marginLeft="15dp" android:textSize="20sp" android:drawablePadding="15dp" android:drawableLeft="@drawable/aev" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </ScrollView>
item.xml文件:
<ImageView android:id="@+id/imageView1" android:layout_width="74dp" android:layout_height="80dp" android:scaleType="centerCrop" android:src="@drawable/ic_addpic" />
Gridview适配器:
public class Adapter extends BaseAdapter{ private Context context; private List<Bitmap> data; private LayoutInflater inflater; private GridView mGridView; private int gridViewH; private int imageViewH; public Adapter(Context context, List<Bitmap> data, GridView mGridView) { this.context = context; this.data = data; this.mGridView = mGridView; inflater = LayoutInflater.from(context); LinearLayout.LayoutParams params = (android.widget.LinearLayout.LayoutParams) mGridView.getLayoutParams(); gridViewH = params.height; Log.i("LJC", gridViewH + ""); } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Holder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.griditem, null); holder = new Holder(); holder.imageView = (ImageView) convertView.findViewById(R.id.imageView1); // 获取到ImageView的高度 RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) holder.imageView.getLayoutParams(); imageViewH = params.height; convertView.setTag(holder); } else { setGridView(); holder = (Holder) convertView.getTag(); } holder.imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); // 绑定图片原始尺寸,方便以后应用 int[] parameter = { data.get(position).getWidth(), data.get(position).getHeight() }; holder.imageView.setTag(parameter); holder.imageView.setImageBitmap(data.get(position)); return convertView; } private void setGridView() { LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) mGridView.getLayoutParams(); if (data.size() < 4) { lp.height = gridViewH; } else if (data.size() < 8) { lp.height = gridViewH * 2 - (gridViewH - imageViewH) / 2; } else { lp.height = gridViewH * 3 - (gridViewH - imageViewH); } mGridView.setLayoutParams(lp); } class Holder { private ImageView imageView; } }
BitmapUtils工具类:public class BitmapUtils { private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize; } /** * 根据Resources压缩图片 * * @param res * @param resId * @param reqWidth * @param reqHeight * @return */ public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; Bitmap src = BitmapFactory.decodeResource(res, resId, options); return src; } /** * 根据地址压缩图片 * * @param pathName * @param reqWidth * @param reqHeight * @return */ public static Bitmap decodeSampledBitmapFromFd(String pathName, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(pathName, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; Bitmap src = BitmapFactory.decodeFile(pathName, options); return src; } }一个小dome到这就完成了,有什么不足之处请大家多多指教!