}else{
isScrollUp = true;
float r = curY / threshold ;
ivOrange.setImageBitmap(circleBitmap(bmOrange, r * screenWidth));
}
}
});
裁剪
private Bitmap circleBitmap(Bitmap o,float radius){
Bitmap outputBm = Bitmap.createBitmap(o.getWidth(),o.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(outputBm);
final Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
final Rect rect = new Rect(0,0,o.getWidth(),o.getHeight());
canvas.drawARGB(0,0,0,0);
canvas.drawCircle(0,0,radius,paint );
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(o,rect,rect,paint);
return outputBm;
}
private Bitmap circleBitmap(Bitmap o,float radius){
Bitmap outputBm = Bitmap.createBitmap(o.getWidth(),o.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(outputBm);
final Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
final Rect rect = new Rect(0,0,o.getWidth(),o.getHeight());
canvas.drawARGB(0,0,0,0);
canvas.drawCircle(0,0,radius,paint );
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(o,rect,rect,paint);
return outputBm;
}
用到paint.setXfermode,传入new PorterDuffXfermode 可以对2d图像的合成模式进行设置。
(.setXfermode这个方法功能很复杂也很强大,有兴趣的可以去百度一下)
总计有18个合成模式:
CLEAR/
SRC/
DST/
SRC_OVER/
DST_OVER
SRC_IN/
DST_IN/
SRC_OUT/
DST_OUT/
SRC_ATOP/
DST_ATOP/
XOR/
DARKEN/
LIGHTEN/
MULTIPLY/
SCREEN/
ADD/
OVERLAY/
合成样式如下图(来源自网络):
这里是用的是SRC_IN 模式,通过绘制一个圆形(半径radius,并会增减),与原bmAbove重叠,之后取相交的部分作为bitmap返回,达到裁剪的效果。
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
《507页Android开发相关源码解析》
(img-Oy9Bp0jU-1646239205348)]
《379页Android开发面试宝典》
[外链图片转存中…(img-LcyiyJkQ-1646239205349)]
《507页Android开发相关源码解析》
[外链图片转存中…(img-4hoD0zbj-1646239205349)]
因为文件太多,全部展示会影响篇幅,暂时就先列举这些部分截图,大家可以**点击这里**自行领取。