Android 自定义View----离屏缓冲和图像混合模式(圆形头像)
这里主要了解下离屏缓冲和图像混合模式,可能在自定义view的时候会用到,绘制的内容也非常简单,一个简单的圆形头像
绘制大概分为5步:
1,开启离屏缓冲
2,绘制一个圆
3,设置图像混合模式 https://www.cnblogs.com/libertycode/p/6290497.html
4,绘制bitmap
5,绘制完成后使用 restoreToCount 将离屏缓冲的绘制内容拿回来
/*** 离屏缓冲和图像混合模式(圆形头像)*/
public class HeadPhotoView extends View {private float imgWidth = UnitUtil.dp2px(260);private float mPadding = UnitUtil.dp2px(50);private Paint mPaint;private Bitmap mBitmap;// 图像混合模式Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);RectF savedArea = new RectF();public HeadPhotoView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}{mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setColor(Color.RED);mBitmap = getAvatar((int) imgWidth);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);savedArea.set(mPadding, mPadding,mPadding + imgWidth, mPadding + imgWidth);}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);/*和save几乎一样,唯一区别相比save会把绘制内容挪到离屏缓冲去必须设置,否则PorterDuffXfermode无效离屏缓冲还可通过setLayerType(LAYER_TYPE_HARDWARE,null)设置:三个参数setLayerType(LAYER_TYPE_HARDWARE,null); 开启硬件加速外会额外有一个离屏缓冲,耗性能setLayerType(LAYER_TYPE_SOFTWARE,null); 关闭硬件加速setLayerType(LAYER_TYPE_NONE,null); 开启硬件加速官方详解用途:在开启动画之前通过setLayerType()开启离屏缓冲,动画结束时再关闭;对自定义属性动画无用,只是自带的属性动画有用例: view.setLayerType(View.LAYER_TYPE_HARDWARE,null);ObjectAnimator animator = ObjectAnimator.ofFloat(view,"rotationY",180);animator.addListener(new AnimatorListenerAdapter(){@Overridepublic void onAnimationEnd(Animator animation){view.setLayerType(LAYER_TYPE_NONE,null)}});animator.start();对比saveLayer():saveLayer比较灵活,在绘制的过程中就可以加,官方建议少用,方法很重setLayerType()相比saveLayer不灵活,而且是全局的,比如在此类中可在{}中添加setLayerType(LAYER_TYPE_HARDWARE,null)开启离屏缓冲,这样就是全局开启离屏缓冲,也就意味着局限性,假设你在此类中做叠加绘制之前有其他绘制内容,就不能使用*/int saved = canvas.saveLayer(savedArea, mPaint);// 绘制一个圆(绘制椭圆是因为坐标点好计算,宽高一样就是圆)canvas.drawOval(mPadding, mPadding,mPadding + imgWidth, mPadding + imgWidth,mPaint);// 设置图像混合模式,进行叠加绘制mPaint.setXfermode(xfermode);// 绘制bitmapcanvas.drawBitmap(mBitmap,mPadding, mPadding, // 左上paddingmPaint);mPaint.setXfermode(null);// 绘制完成后使用 restoreToCount 将离屏缓冲的绘制内容拿回来canvas.restoreToCount(saved);}Bitmap getAvatar(int width) {BitmapFactory.Options options = new BitmapFactory.Options();// inJustDecodeBounds为true,不返回bitmap,只返回这个bitmap的尺寸options.inJustDecodeBounds = true;// 从资源中读取(比较浪费资源,所以上面设置为true,只获取图片宽高)BitmapFactory.decodeResource(getResources(), R.drawable.qyn, options);// 再设置为false,最后要返回bitmapoptions.inJustDecodeBounds = false;// 根据缩放比例重新计算宽高options.inDensity = options.outWidth;options.inTargetDensity = width;return BitmapFactory.decodeResource(getResources(), R.drawable.qyn, options);}}
硬件加速:CPU把绘制内容转换为GPU操作,然后交给GPU进行,由GPU负责真正的绘制,这就叫硬件绘制,使用GPU绘制就叫做硬件加速;
离屏缓冲:单独的一个绘制View的区域
Android 自定义View----离屏缓冲和图像混合模式(圆形头像)相关推荐
- android缓冲机制,Android自定义View之双缓冲机制和SurfaceView
Android自定义View系列 双缓冲机制 问题的由来 CPU访问内存的速度要远远快于访问屏幕的速度.如果需要绘制大量复杂的图像时,每次都一个个从内存中读取图形然后绘制到屏幕就会造成多次地访问屏幕, ...
- Android自定义View之Paint绘制文字和线
Android自定义View系列 Android自定义View注意事项 Android自定义View之图像的色彩处理 Android自定义View之Canvas Android自定义View之轻松实现 ...
- Android自定义View注意事项
Android自定义View系列 Android自定义View之Paint绘制文字和线 Android自定义View之图像的色彩处理 Android自定义View之Canvas Android自定义V ...
- android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定
概述: 360安全卫士的那个刷新球(姑且叫它刷新球,因为真的不知道叫什么好,不是dota里的刷新球!!),里面像住了水一样,生动可爱,看似简单,写起来不太简单,本例程只是实现了它的部分功能而已,说实话 ...
- android 自定义view 硬件加速,Android自定义View(八) -- 硬件加速
Android自定义View(八) – 硬件加速 今天学习自定义View部分的最有一篇:硬件加速因为无法录制GIF,所以本篇内容基本为原博 本文计划根据HenCoder系列文章进行学习,所以代码风格及 ...
- android自定义view之九宫格解锁
android自定义view之九宫格解锁 更多细节请看源码 https://github.com/que123567/lockview 1. 定义一个类作为九宫格的格子 包含坐标和索引(用来记录密码) ...
- Android 自定义View 圆形圆角图片
[Android 自定义View 圆形圆角图片] 基于Xfermode 实现 1.概述 在很久以前也写过一个利用Xfermode 实现圆形.圆角图片的(Android 完美实现图片圆角和圆形(对实现进 ...
- android代码实现手机加速功能,Android自定义View实现内存清理加速球效果
Android自定义View实现内存清理加速球效果 发布时间:2020-09-21 22:21:57 来源:脚本之家 阅读:105 作者:程序员的自我反思 前言 用过猎豹清理大师或者相类似的安全软件, ...
- android波纹效果弹窗,Android自定义View实现波纹效果
Android自定义View实现波纹效果 时间:2017-05-27 来源:移动互联网学院 1.引言:随着Android智能手机的普及,Android应用得到了大力支持,而Android应用的 ...
最新文章
- MongoDB安装和MongoChef可视化管理工具的使用
- 一键实现变老变年轻——Windows 10 下部署PaddleGAN,带你感受从年少到白头的浪漫
- mysql5.7.19带源码_CentOS7 + Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装
- Spark RDD使用详解1--RDD原理
- 游戏运营杂谈之-----IB推荐算法
- linux e514写入错误,Linux上使用vim编辑文件保存时报错:E514: write error (file system full?)...
- ActiveReports 报表应用教程 (8)---交互式报表之动态过滤
- linux右键菜单的截图,Linux: 给右键菜单加一个“转换图片为jpg格式”
- 特斯拉召回部分进口Model S、Model X电动汽车
- 解题报告 幸福的道路
- Android自定义属性:format选项之reference
- vc6.0项目到vc2013移植记录
- 开机时无法进入系统,提示windows system32/winload.exe 无法加载
- java对接金蝶webapi
- 修复IOS上滑动HTML界面光标乱跳
- F2FS--针对SSD的文件系统
- 2021-08-14 《 生活大爆炸版石头剪刀布》P1328
- 【转载】儒林外史人物——严贡生和严监生(一)
- oracle 第一范式,数据库范式之第一范式
- vue ElementUI实现的记事日历