Android图片裁剪功能实现代码图片裁剪功能实现代码
主要为大家详细介绍了Android图片裁剪功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在Android应用中,图片裁剪也是一个经常用到的功能。Android系统中可以用隐式意图调用系统应用进行裁剪,但是这样做在不同的
手机可能表现出不同的效果,甚至在某些奇葩手机上还会出其他更奇怪的问题,所以调用系统功能进行图片裁剪在很多时候对我们
来说并不是一个好的选择。这时候就需要我们自己去实现这种裁剪功能了。
功能分析功能分析
要完成图片裁剪的功能,我们需要先知道图片裁剪的功能有哪些。图片裁剪之前,我们需要有一个框指示我们需要裁剪的样式合大
小。图片显示出来后大小和位置可能并不是我们所期望的,所以我们还需要对图片进行移动、缩放等操作。确定好位置和大小后,
我们需要真正的对图片进行裁剪,并将裁剪的图片存起来以供使用。也就是说需要实现图片裁剪的功能细分后如下:
1、显示指示框
2、图片移动和缩放
3、图片裁剪并保存
最终效果展示如下:
功能实现功能实现
显示指示框显示指示框
要实现显示一个如上图一样的指示框有很多方法,这里实现的方式是用自定义的Drawable作为View的背景,然后将这个View覆盖在
原图片上作为指示框。为了在一定程度上满足更多的要求,我们让指示框可设置为矩形也可设置为圆形,阴影区域的颜色也可设
置。
要绘制出作为指示的图层,我们可以将它拆分成两半,变成两个封闭的Path进行绘制,也可以先绘制出半透明的覆盖层,然后在中
间裁剪一个洞。显然,要考虑到这个洞的形状大小并不是固定的,裁剪的方式比拆分成两个封闭的Path要简单多了。
Canvas的canvas.clipPath(Path, Region.Op);方法,可以对Canvas进行裁剪,可以很容易得到这样的指示框。然而Canvas的
clipPath裁剪出来的曲线图形会有锯齿,我多番尝试都没能去掉锯齿,所以不得不放弃这个方法。继而利用paint
的paint.setXfermode(new PorterDuffXfermode(mode))方法来实现这个效果。
Android 4.4的Path增加了裁剪功能,我们可以直接用Path的path.op(Path, Path.Op)方法将Path裁剪成我们需要的形状再进行绘制,
这种方式效率更高。
指示框Drawable的核心代码如下:
@Override
public void draw(@NonNull Canvas canvas) {
int cWidth=canvas.getWidth();
int cHeight=canvas.getHeight();
if(rect==null){
rect=new Rect(cWidth/2-width/2,cHeight/2-height/2,cWidth/2+width/2,cHeight/2+height/2);