微信仿朋友圈添加图片

问题:

  1. 添加过多图片时,会出现OOM。
  2. 如何动态修改图片展示栏的高度。
  3. 加号如何伴随图片的增加而后移。
  4. 如何保证最多添加照片为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到这就完成了,有什么不足之处请大家多多指教!

微信仿朋友圈添加图片相关推荐

  1. 使用GridView实现仿微信发朋友圈添加图片,点击预览、删除图片

    最近在项目中有一个用户反馈的功能中要上传图片,和微信发朋友圈添加图片的功能其实有点类似,所以我想着用GridView来实现这个功能,整个过程也很简单,画不多说,详细步骤见下: 1.先来看MainAct ...

  2. Android 仿微信朋友圈添加图片

    github地址(欢迎下载Demo) https://github.com/zhouxu88/WXCircleAddPic 老习惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧, ...

  3. android 微信高仿,Android 高仿微信发朋友圈浏览图片效果(转)

    最近一直在高仿微信.高仿微信,今天小编再给大家分享一个仿微信发朋友圈浏览图片的效果.... 好了,先看一下效果吧: 这里写图片描述 下面就来说一下具体怎么实现的: 实现思路 1.首先我们要获取数据源, ...

  4. Android 高仿微信发朋友圈浏览图片效果

    最近一直在高仿微信.高仿微信,今天小编再给大家分享一个仿微信发朋友圈浏览图片的效果.... 好了,先看一下效果吧: 下面就来说一下具体怎么实现的: 实现思路 1.首先我们要获取数据源,数据源就是我们的 ...

  5. php仿微信朋友圈源码,Android开发仿微信发朋友圈浏览图片效果实例代码

    这篇文章主要介绍了Android仿微信发朋友圈浏览图片效果的相关资料,需要的朋友可以参考下 先看一下效果吧: 下面就来说一下具体怎么实现的: 实现思路1.首先我们要获取数据源,数据源就是我们的每条说说 ...

  6. 仿朋友圈相册图片选择以及画廊效果

    仿朋友圈相册图片选择以及画廊效果 1.效果展示 2.导入相关第三方库依赖 3.编写选择图片页面 a.编写布局 b.编写Activity c.相册选择工具类部分代码 d.相册4宫图适配器 4.编写画廊页 ...

  7. Android 仿朋友圈,文字图片视频多条目,自动播放暂停

    因为太长了不能把项目搬过来,记一下关键点 多条目都会,然而这里因为微信朋友圈界面的特殊,他有一个头部,开始我是做的ScrollView+RecyclerView,后来发现在Scrollview 的包裹 ...

  8. thinkphp实现微信分享朋友圈自定义图片和文字

    1.进行微信公众号配置. 需要先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名". 然后将文件MP_verify_ ...

  9. iOS高仿微信发朋友圈,图片拖拽,删除组件

    源码地址:https://github.com/Jethuang/HDragImageView

最新文章

  1. 乐观锁 CAS 悲观锁synchronized()性能低因为涉及操作系统内核与用户模式的切换
  2. taro 在components文件夹中 新建组件时,组件支持自定义命名,但是不能大写开头...
  3. MFC文件操作大全,打开,保存,复制,删除,查找等
  4. 集合框架-Collection与List集合
  5. 使用“Grafeas”元数据API和“Kritis”部署授权管理软件供应链
  6. 易语言数据类型与c 对照,详解易语言中的数据类型
  7. Linux常用软件包
  8. 惠普服务器电脑装系统教程,惠普台式电脑装系统步骤
  9. 关于python3.9安装Airtest跑脚本“jinja2”报错的问题说明
  10. 腾讯微信人工客服电话/微信客服怎么正确拨打人工电话
  11. Linux进程池、线程池调研
  12. 美丽的数据 :数据可视化与信息可视化浅谈
  13. python全案例学习_Python全案例学习与实践
  14. 手机版python3h如何自制游戏_教你如何用 Python 写一个小游戏
  15. UML--核心元素之参与者Actor
  16. c#使用pop3服务器进行邮箱验证
  17. matplotlib:使用emoji字体实现简易象形图
  18. Kafka的灵魂伴侣Logi-KafkaManger(4)之运维管控–集群运维(数据迁移和集群在线升级)
  19. Creator口红机实现
  20. 3.15打假日:没有“集成”的永中就是假永中

热门文章

  1. 使用PHP二维码生成类库PHP QR Code生成个人名片
  2. AI生成藝術(No.4):訓練自己的CycleGAN模型 - -使用Paddle
  3. 6.27王者荣耀说服务器在维护,王者荣耀为什么进不去维护到几点 王者荣耀6月27日几点维护完?...
  4. (转)HTC宏达与多普达间的关系
  5. 数据库事务的四种隔离级别
  6. OpenCasCade拓扑几何的布尔运算
  7. 一看就懂的Alpha-Beta剪枝算法详解
  8. 只是因为多看了你一眼
  9. 详解C语言中的stdin,stdout,stderr
  10. python sys stdout_如何理解python中的sys.stdout和sys.stderr