GridView动态展示照片,长按删除,支持点击放大,裁剪实现
2016-11-22 15:31
555 查看
案列:进入页面,判断网络是否有资源照片,没有则默认展示添加的照片!
点击进行图片相册的选择,这里也可以进行相机的拍照的选取!
对照片进行裁剪,保存后上传网络!
如需要删除,则长按删除即可!点击非第一个iten进行图片放大!
第一步:xml布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:background="#f3f4f8" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!--title--> <include layout="@layout/layout_title_bar"/> <!--请上传公司照片--> <TextView android:textSize="12sp" android:textColor="#979797" android:layout_marginTop="10dp" android:gravity="center_horizontal" android:text="请上传个人照片(限9张),长按可删除" android:layout_width="match_parent" android:layout_height="wrap_content"/> <!-- 网格显示图片 行列间距5dp 每列宽度90dp --> <GridView android:id="@+id/boss_playphoto_gridview" android:layout_width="fill_parent" android:paddingLeft="5dp" android:layout_height="400dp" android:layout_margin="10dp" android:layout_marginTop="20dp" android:columnWidth="90dp" android:gravity="center" android:horizontalSpacing="5dp" android:numColumns="4" android:stretchMode="columnWidth" android:verticalSpacing="5dp"/> </LinearLayout>
第二步:封装数据到bean类中,id和imageUrl(id是后面根据它来删除对应的照片)
/** * @创建者 luck * @创建时间 ${DATA} 15:48 * @描述 ${公司资料 - 展示照片} * @更新者 $Author$ * @更新时间 $Date$ * @更新描述 ${TODO} */ public class BossPersonPlayPhotoBean2{ public Integer id; public String imgUrl; public BossPersonPlayPhotoBean2() { super(); } public BossPersonPlayPhotoBean2(int id, String imgUrl) { super(); this.id = id; this.imgUrl = imgUrl; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; }}
第三步:初始化控件
@BindView(R.id.btn_left) Button mBtn_left; //title back @BindView(R.id.txt_title) TextView mTxt_title; //title @BindView(R.id.boss_playphoto_gridview) GridView mBoss_playphoto_gridview; //gridview
第四步:初始化事件(demo是直接将适配器写在这里,将数据添加到集合,在适配器那边直接在bean拿即可!)
/** * init-data */ private void initData() { mAdapter = new BossPersonPPAdapter(mPhotoData, UiUtils.getContext()); mBoss_playphoto_gridview.setAdapter(mAdapter); mBoss_playphoto_gridview.setOnItemClickListener(this); mBoss_playphoto_gridview.setOnItemLongClickListener(this); }
第五步:iten的点击事件处理(判断是否是第一个,以及展示大图的处理)
/** * gridview item点击 * @param parent * @param view * @param position * @param id */ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (mPhotoData.size() == 10) { //第一张为默认图片 UiUtils.toast("图片数9张已满"); return; } if (position == 0) { //item就添加图片,不是就展示图片 UiUtils.toast("添加图片"); //选择图片 这里可以设置选择的图片的格式 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, REQUESTCODE_PICK); } else { //使用activity来展示大图 Intent intent = new Intent(UiUtils.getContext(), BossPersonKeFuShowPhotoActivity.class); intent.putExtra("urlpath", urlpath); startActivity(intent); } }
第六步:iten的长按点击处理
/** * 长按点击 * @param parent * @param view * @param position * @param id * @return */ @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { if (position == 0) { //长按的时候获取位置的信息,将其进行删除 UiUtils.toast("请选择图片"); } else { dialog(position); } return true; }
第七步:长按点击进行弹框实现通知删除
/** * Dialog对话框提示用户删除操作 * position为删除图片位置 * @param position */ protected void dialog(final int position) { AlertDialog.Builder builder = new AlertDialog.Builder(BossPersonPlayPhotoActivity.this); builder.setMessage("确认移除已添加图片吗?"); builder.setTitle("提示"); builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); BossPersonPlayPhotoBean.getInstance().postDeleteEliteImg(mPhotoData.get(position).getId()); mPhotoData.remove(position); mAdapter.notifyDataSetChanged(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); }
第八步:进行回调设置
/** * 获取图片路径 响应startActivityForResult--回调 * @param requestCode * @param resultCode * @param data */ protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQUESTCODE_PICK: // 直接从相册获取 try { startPhotoZoom(data.getData()); } catch (NullPointerException e) { e.printStackTrace(); // 用户点击取消操作 } break; case REQUESTCODE_CUTTING: // 取得裁剪后的图片 if (data != null) { setPicToView(data); } break; } }
第九步:进行裁剪的实现
/** * 裁剪图片方法实现 * @param uri */ public void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop", "true"); // intent.putExtra("circleCrop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 300); intent.putExtra("outputY", 300); intent.putExtra("return-data", true); this.startActivityForResult(intent, REQUESTCODE_CUTTING); }
第十步:将裁剪的可以设置到控件的上面 - 以及上传到网络
/** * 保存裁剪之后的图片数据 * @param picdata */ private void setPicToView(Intent picdata) { Bundle extras = picdata.getExtras(); if (extras != null) { mPhoto = extras.getParcelable("data"); // 取得SDCard图片路径做显示 Drawable drawable = new BitmapDrawable(null, mPhoto); // String name = "emper-icon-" + UserInfoOrSet.getAboutInt("employerId") + "_" + new SimpleDateFormat("yyyy-MM-dd-hh-MM-dd_hh:mm:ss").format(new Date()); String name = "BossShowImg" +"_" + new SimpleDateFormat("yyyy-MM-dd-hh-MM-dd_hh:mm:ss").format(new Date()); String path = Environment.getExternalStorageDirectory() + "/together"; Log.d("log------------------","mPhoto="+mPhoto+"path="+path+"name="+name); urlpath = ImageTools.savePhotoToSDCard(mPhoto,path,name); Log.d("log","urlpath="+urlpath); // circleImageView.setImageDrawable(drawable); //将照相的图片直接设置到图标上面-- uploadIcon(); //上传 -- 直接将图片进行上传即可 // setPhoto(); //设置图片 } }
总结:首先,我这边上传的是七牛云的服务器,因此上传的就没有进行展示
!
之前,我用的是simpleadapter+gridview来写这个,如果写个demo直接展示mipmap下面的图片的时候,写的很方便,针对第一个iten的时候可以直接进行设置,但是显示设置显示网络的图片的时候会出现问题(也有两种方案解决),不注意的话也犯内存溢出问题。呵呵!还有一点就是和别人交流的就是simpleadapter的效率低的问题,难道是后面的映射等各方面
?不太明白!
后来我就换了种思想:首先想到的是使用map集合实现,通过键值取对应键值,后面删除的话,也可以通过键找值取删除值,但是遇到了一问题就是在展示的时候,全部展示位同一张照片!且处理的默认图片也没有进行展示, 之后找到原因就是迭代器的hasNext();whlie循环的里面多走了一次,不知道大家是怎么解决的!可以交流哈。。。
后来就直接封装到bean里面吧,用的时候直接拿吧,还可以基本上!
后期如果扩展到照相去获取以及相册同时的话,就可以写一个popuwindow将两个添加到一起实现!
注意:展示图片可以用三方的imageoader即可!像glide也可以,其它的两个也行!比较懒,我这里用的是glide去展示,它里面的
BitmapTransformation
你可以直接去继承写圆形的或者圆角的都可以!
/** * 设置圆形图片 */ public class GlideCircleTransform extends BitmapTransformation { public GlideCircleTransform(Context context) { super(context); } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return circleCrop(pool, toTransform); } private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; // TODO this could be acquired from the pool too Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, paint); return result; } @Override public String getId() { return getClass().getName(); } }
/** * 设置圆角方法 */ public class GlideRoundTransform extends BitmapTransformation { private static float radius = 0f; public GlideRoundTransform(Context context) { this(context, 4); } public GlideRoundTransform(Context context, int dp) { super(context); this.radius = Resources.getSystem().getDisplayMetrics().density * dp; } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return roundCrop(pool, toTransform); } private static Bitmap roundCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; int min = Math.min(source.getWidth(), source.getHeight()); Bitmap result = pool.get(min, min, Bitmap.Config.ARGB_8888); //根据图片的不同分辨率,来计算切除的圆角 radius = (Math.min(source.getWidth(), source.getHeight()) / 100f * 10f); if (result == null) { result = Bitmap.createBitmap(min,min, Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); //RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); //RectF rectF = new RectF((source.getWidth() - min)/2, (source.getHeight() - min)/2, min + (source.getWidth() - min)/2, min + (source.getHeight() - min)/2); RectF rectF = new RectF(0f, 0f, min, min); canvas.drawRoundRect(rectF, radius, radius, paint); return result; } @Override public String getId() { return getClass().getName() + Math.round(radius); } }
使用:
Glide.with(imageView.getContext()).load(url).transform(new GlideRoundTransform(imageView.getContext()))
望大家指点!谢谢!
相关文章推荐
- Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)
- 点击新增或删除按钮实现GridView动态增减行
- 4000 照片的选择+照片Gridview展示(拖拽排序、删除)+照片viewpager演示(放大、缩小)
- [置顶] Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)附源码
- DATAGRIDVIEW动态筛选数据,实现编辑之后,点击按钮更新,及删除选中的列到数据库。
- jQuery+css3实现Ajax动态点击删除功能
- 在开发中实现点击 WebView 中的图片,调用原生控件放大展示
- 点击按钮实现表格动态添加或删除一行
- ImageView 实现从手机相册中获取照片,并可以进行裁剪或者适屏展示
- Spring实现动态数据源,支持动态添加、删除和设置权重及读写分离
- nginx(非openresty) 实现解析uri自动upstream并支持动态新增删除(redisCluster)节点(四种方式)
- android实现界面左右滑动(GridView动态设置item,支持每个item按某个属性排序来显示在不同的界面)
- 【支持动态gif格式】基于java实现图像裁剪以及生成缩略图功能
- 点击图片缩略图放大展示效果的实现
- android实现界面左右滑动(GridView动态设置item,支持每个item按某个属性排序来显示在不同的界面)
- ImageView+ViewPager+PhotoView实现朋友圈图片点击全屏查看支持放大缩小
- Android中照相,从相册选取照片,压缩,保存到手机内存,展示到界面,点击放大,上传。(含demo)
- ANDROID展示HTML图文混排--实现图片缩小并点击放大
- Spring实现动态数据源,支持动态添加、删除和设置权重及读写分离
- 动态的把数据显示在table中,点击某一行的删除按钮实现该行的删除(通过ajax实现页面的无刷新加载)