Android仿微信添加照片并且随意限制照片数量并显示缩略图界面
来源:互联网 发布:计算机二级考试 知乎 编辑:程序博客网 时间:2024/04/29 09:37
前段时间做项目时产品加入一个新功能,拍照并显示缩略图,之前我们公司的都是只显示拍了几张照片 然后点击之后跳到另外一个界面显示这几张照片,自我感觉这种方式很是不方便,就趁次机会做了一个实用并且通用的拍照显示工具,先看效果
这是拍照过程中,如果没有达到设定的拍照数量那么拍照按钮就显示着还可以继续拍
当拍照数量达到设定的数量后最后的拍照按钮隐藏,我在这里设置的9张照片,你用的时候可以随意设置
一、实现这个功能主要在于适配器怎么写,其实逻辑也比较简单,我们定一个数字作为照片数量的限制,然后在适配器getCount()方法中用这个值和现有照片数量做对比然后返回相应的数量即可,写的demo,所以主界面很简单 就一个GridView,其实现在可以用recycleview代替现有的Listview和GridView,比如前几天我就遇到一个这个问题,产品原型画出来了,效果图还没出来,数据也没有,但我们不能等他们要先用假数据做界面,其中一个界面是这样的,就是一个列表,每个item是一张图对应一句话,原型是一行一个,我就想着先用listview把效果实现了,等设计和数据来了稍作修改即可,可不曾想设计图出来后傻了,设计觉得每行显示一列不好看,设计成了每行两列,这就意味着我要重新换控件,如果以后界面再改又要换,所以直接用了recycleview,这样以后管他横排竖排横滑竖滑只需对recycleview进行设置即可,话说回来,我们这里还暂用GridView,因为我不想再换了,想换可以自行修改
二、主界面就是拍照然后刷新适配器这些操作,我们直接看adapter
item布局要注意一下,因为要包含图片和拍照按钮
代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:background="@drawable/selector_presse" android:orientation="vertical" > <ImageView android:id="@+id/iconImageView" android:layout_width="match_parent" android:layout_height="130dp" android:background="@null" android:scaleType="fitXY" android:src="@drawable/defelt_icon" /> <FrameLayout android:id="@+id/framelayout_add_pic" android:layout_width="match_parent" android:layout_height="130dp" android:background="@color/gray_bg_color" > <LinearLayout android:layout_width="match_parent" android:layout_height="130dp" android:gravity="center" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="+" android:textColor="@color/gray_text_color" android:textSize="40dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="添加图片" android:textColor="@color/gray_text_color" /> </LinearLayout> </FrameLayout></LinearLayout>由于拍照按钮用照片的话在不同手机上显示效果不同,有可能会变形,所以用了布局的方式,图片加文字,这样看着就会很自然,再看适配器主要是getcount()方法
@Overridepublic int getCount() {int size = 1;if (mPictures.size() >= mNums) {// 限制拍照数量mNums张size = mPictures.size();} else {size += mPictures.size();}return size;}这里面的mNums是传进来的 用于限定拍照数量,拍照按钮显示与否是要靠返回的size控制,这里至少要返回1,因为一开始要显示拍照按钮,如果没有达到设定数量,那么每次返回的数量要+1,给拍照按钮留下位置,如果达到数量那么就直接返回照片数量,不需多返回一个位置,至于显示照片还是添加照片按钮要在下面的getView()种控制。构造如下:其中CreateBmpFactory是拍照的一个工具类,稍后我会上传完整demo
public PhotoAdapter(List<String> mPictures, int mNums, CreateBmpFactory mCreateBmpFactory, Context mContext) {super();this.mPictures = mPictures;this.mCreateBmpFactory = mCreateBmpFactory;this.mContext = mContext;this.mNums = mNums;}然后另一关键处是getView()方法里要靠position和照片集合的size对比,因为position是从0开始,而size是从1开始,所以正常情况下position总是比size小,所以当position==mPictures.size()的时候说明此时getCount()多返回了一个位置,此时就是拍照数量没达到设定值需要显示拍照按钮(这个地方有点绕),来看getView()方法:
@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {holder = new ViewHolder();convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_picture, parent, false);holder.iv_icon = (ImageView) convertView.findViewById(R.id.iconImageView);holder.framelayout_add_pic = (FrameLayout) convertView.findViewById(R.id.framelayout_add_pic);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}if (position == mPictures.size()) {holder.iv_icon.setVisibility(View.GONE);holder.framelayout_add_pic.setVisibility(View.VISIBLE);} else {holder.iv_icon.setVisibility(View.VISIBLE);holder.framelayout_add_pic.setVisibility(View.GONE);holder.iv_icon.setTag(mPictures.get(position).toString());new GetBitmapTask().execute(holder.iv_icon);}convertView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (position == mPictures.size()) {AlertDialog.Builder builder = new AlertDialog.Builder(mContext );builder.setTitle("请选择操作");final String[] menu = { "拍照", "从图库中选择" };builder.setItems(menu, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which) {case 0:mCreateBmpFactory.OpenCamera();break;case 1:mCreateBmpFactory.OpenGallery();break;}}});builder.show();} else {AlertDialog.Builder builder = new Builder(mContext).setTitle("查看大图");View view = LayoutInflater.from(mContext).inflate(R.layout.layout_img_dialog, null);ImageView bigPhoto = ((ImageView) view.findViewById(R.id.bigPic));bigPhoto.setImageBitmap(BitmapFactory.decodeFile(mPictures.get(position).toString()));builder.setView(view).setPositiveButton("删除", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 删除图片mPictures.remove(position);notifyDataSetChanged();}}).setNegativeButton("返回", null).create().show();}}});return convertView;}主要判断在于这:
if (position == mPictures.size()) {holder.iv_icon.setVisibility(View.GONE);holder.framelayout_add_pic.setVisibility(View.VISIBLE);} else {holder.iv_icon.setVisibility(View.VISIBLE);holder.framelayout_add_pic.setVisibility(View.GONE);holder.iv_icon.setTag(mPictures.get(position).toString());new GetBitmapTask().execute(holder.iv_icon);}当然那个弹框看大图的只是实现以下点击事件,这里你可以进行你自己的其他操作。由于显示的是图片所以会有一个问题就是图片过大时候会比较卡,比如你项目里用的时候肯定是要保存图片然后进行回显的,这时候直接主线程里加载就会很卡,所以显示照片的操作可以放在线程里面做,上面的new GetBitmapTask().execute(holder.iv_icon)就是用来异步加载的,具体实现如下:
class GetBitmapTask extends AsyncTask<ImageView, Void, ImageView> {Bitmap bitmap = null;ImageView view = null;@Overrideprotected ImageView doInBackground(ImageView... params) {// TODO Auto-generated method stubview = params[0];String path = view.getTag().toString();bitmap = BitmapHelp.getSmallBitmap(path);return view;}@Overrideprotected void onPostExecute(ImageView v) {// TODO Auto-generated method stubv.setImageBitmap(bitmap);super.onPostExecute(v);}}传入控件,把照片的路径以Tag的方式设置给控件即可。至此功能完美实现,下面附上demo
如果觉得好用欢迎加入qq群交流:579699145
源码下载地址:
http://download.csdn.net/detail/wangyuntuan/9904043
- Android仿微信添加照片并且随意限制照片数量并显示缩略图界面
- 上传照片并显示
- 上传照片并显示
- android调用系统相机拍照保存照片并显示在当前界面
- android 打开本地相册,并将选择的照片显示到当前界面
- android 从图库或者相机拍照获得照片并显示在界面上
- 选择相册中的照片并获得缩略图
- Android高仿微信照片选择器+预览+显示照片
- 使用微信的 JS SDK 选取手机照片并进行上传,Iphone无法显示缩略图
- Android 仿微信显示的聊天照片
- 调用手机的摄像头,并且返回照片显示在程序界面上.
- Android使用相机获取照片并显示的代码
- android获取SDCard中照片并按照时间顺序显示
- android获取SDCard中照片并按照时间顺序显示
- android获取SDCard中照片并按照时间顺序显示
- android获取SDCard中照片并按照时间顺序显示
- android--调用系统相机拍照,显示并保存照片 - zhengwen
- Android 7.0 拍照并显示照片出现"FileUriExposedException"
- Spring定时任务实现
- 省市区三级联动
- 获取项目的根路径(后台,前段两种手段)
- 【protobuf】protobuf初体验 python2
- spring过滤值为null的JSON字段
- Android仿微信添加照片并且随意限制照片数量并显示缩略图界面
- Problem
- ajax跨域(No 'Access-Control-Allow-Origin' header is present on the requested resource)
- 虚拟机的使用
- R语言深度学习mxnet做分类
- IOS input输入会白屏
- C++ IO库
- 记录下自己接百度导航的问题
- 安装wxpython for Python3.5