IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Canvas - saveLayer() & restoreToCount() -> 正文阅读

[移动开发]Android Canvas - saveLayer() & restoreToCount()

说起 saveLayer() & restoreToCount(),不得不先说 save() & restore()。关于 save() 和 restore 的可以参考 https://blog.csdn.net/tianjf0514/article/details/125580295

saveLayer 和 save 相似,但是又有区别。

saveLayer 和 save 的区别

先看一个例子:

class CustomView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {

    private val imagePaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG)
    private val maskPaint: Paint = Paint(Paint.ANTI_ALIAS_FLAG)
    private val bitmap: Bitmap by lazy {
        BitmapFactory.decodeResource(
            resources,
            R.drawable.ic_launcher
        )
    }

    init {
        setBackgroundColor(Color.WHITE)
        maskPaint.color = Color.WHITE
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)

        canvas.drawBitmap(bitmap, 0f, 0f, imagePaint)

        canvas.save()
        canvas.drawRect(0f, 0f, bitmap.width.toFloat(), bitmap.height.toFloat(), maskPaint)
        maskPaint.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
        canvas.drawCircle(bitmap.width / 2.0f, bitmap.height / 2.0f, 35.0f, maskPaint)
        canvas.restore()
    }
}

这个例子先绘制了一个图片,然后绘制了一个和图片一样大的白色区域覆盖在图片上面,最后绘制了一个 PorterDuff.Mode.CLEAR 的圆形清空掉中间圆形区域。
本来的目的是想绘制一张圆形的图片。
例子中用了 save 目的是想保证清空操作不影响到图片,但是我们能达到想要的效果吗?下面看看效果图:

看来是失败了,为什么呢?
save 虽然能够保存状态,但是不会创建新的图层,所以清空操作还是在原来的图层上去操作,当然也会把绘制的图片给清空掉。显示黑色是因为屏幕默认黑色。
要想创建新图层,可以用 saveLayer 方法。
将上面例子中的

canvas.save()

替换为

val layer = canvas.saveLayer(0f, 0f, width.toFloat(), height.toFloat(), null)

canvas.restore()

替换为

canvas.restoreToCount(layer)

再次运行,效果如下:

可以看到,这次成功了!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-07-05 23:36:33  更:2022-07-05 23:37:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 23:21:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码