本文共 1478 字,大约阅读时间需要 4 分钟。
需求:将图片放入固定框中,通过对图片进行缩放和移动,将框内的部分裁剪出来
分析:传统的做法大概是这样,调用系统的图片裁剪界面
Intent intent = new Intent("com.android.camera.action.CROP"); // 判断版本大于等于7.0 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 给目标应用一个临时授权 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } intent.setDataAndType(data, "image/*"); // crop为true时表示显示的view可以剪裁 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX,outputY 是剪裁图片的宽高 intent.putExtra("outputX", 200); intent.putExtra("outputY", 200); uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); startActivityForResult(intent, PHOTOZOOM);
但系统的东西~你懂的,没几样好用的,这个框没办法固定不变,用户可以随意调整它的大小,导致即使可以通过设置aspectX和aspectY来达到初始时的宽高比,但不符合我们的需求。更搞笑的是,它又支持设置outputX和outputY,即,不论用户如何调整框的大小,得到的图片大小永远是宽为outputX像素,高为outputY像素,假如我设置outputX和outputY都是200,结果裁剪框被用户拉成了1:2的比例,得到的图片就是被压扁的!试问,还有比这更垃圾的系统接口吗??
处理:自定义~参考了鸿洋的博客以及LargeImage的大图框架,整合成符合需求的代码
见
注:获取当前大图在框中的位图方法:
public Bitmap clip() { //开启绘图缓存 setDrawingCacheEnabled(true); //返回当前View的视图缓存 return getDrawingCache();}
效果图:
可以缩放调整大小:
裁剪所得:
转载地址:http://garki.baihongyu.com/