Xfermode的完全使用解析

这篇具有很好参考价值的文章主要介绍了Xfermode的完全使用解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作用:将不同的绘制内容结合到一起
先绘制 一张图片

package com.example.viewtest.view

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Paint
import android.util.AttributeSet
import android.view.View
import com.example.viewtest.R
import com.example.viewtest.ext.dp

private val IMAGE_WIDTH = 200.dp
private val IMAGE_PADDING = 20.dp
class AvatarView(context: Context, attrs: AttributeSet) : View(context, attrs) {
    
    private val paint = Paint(Paint.ANTI_ALIAS_FLAG)

    override fun onDraw(canvas: Canvas) {
        canvas.drawBitmap(getAvatar(IMAGE_WIDTH.toInt()), IMAGE_PADDING, IMAGE_PADDING, paint)
    }

    fun getAvatar(width: Int): Bitmap {
        val options = BitmapFactory.Options()
        // 第一次只读上下左右四个角的尺寸,这个速度是超级快的
        options.inJustDecodeBounds = true
        BitmapFactory.decodeResource(resources, R.drawable.ic_choice_select, options)
        options.inJustDecodeBounds = false
        // 本身的大小
        options.inDensity = options.outWidth
        // 实际想要的大小
        options.inTargetDensity = width
        // 无论原图有多大,都能读出一个很小,很快的图
        return BitmapFactory.decodeResource(resources, R.drawable.ic_choice_select, options)
    }
}

然后再绘制一个圆形,重叠在一起,圆形之外的部分透明显示文章来源地址https://www.toymoban.com/news/detail-702661.html

package com.example.viewtest.view

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.graphics.RectF
import android.util.AttributeSet
import android.view.View
import com.example.viewtest.R
import com.example.viewtest.ext.dp

private val IMAGE_WIDTH = 200.dp
private val IMAGE_PADDING = 20.dp
private val XFERMODE = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
class AvatarView(context: Context, attrs: AttributeSet) : View(context, attrs) {

    private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
    private val bounds = RectF(IMAGE_PADDING, IMAGE_PADDING, IMAGE_PADDING + IMAGE_WIDTH,IMAGE_PADDING + IMAGE_WIDTH )

    override fun onDraw(canvas: Canvas) {
        val count = canvas.saveLayer(bounds, null)
        canvas.drawOval(bounds, paint)
        paint.xfermode = XFERMODE
        canvas.drawBitmap(getAvatar(IMAGE_WIDTH.toInt()), IMAGE_PADDING, IMAGE_PADDING, paint)
        paint.xfermode = null
        canvas.restoreToCount(count)
    }

    private fun getAvatar(width: Int): Bitmap {
        val options = BitmapFactory.Options()
        // 第一次只读上下左右四个角的尺寸,这个速度是超级快的
        options.inJustDecodeBounds = true
        BitmapFactory.decodeResource(resources, R.drawable.qr_download, options)
        options.inJustDecodeBounds = false
        // 本身的大小
        options.inDensity = options.outWidth
        // 实际想要的大小
        options.inTargetDensity = width
        // 无论原图有多大,都能读出一个很小,很快的图
        return BitmapFactory.decodeResource(resources, R.drawable.qr_download, options)
    }
}

到了这里,关于Xfermode的完全使用解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 使用OpenCV实现实时人脸识别,并绘制到SurfaceView上

    上篇文章 我们已经通过一个简单的例子,在 Android Studio 中接入了 OpenCV 。 之前我们也 在Visual Studio上,使用OpenCV实现人脸识别 中实现了人脸识别的效果。 接着,我们就可以将 OpenCV 的人脸识别效果移植到 Android 中了。 1.1 环境说明 操作系统 : windows 10 64 位 Android Studio 版本

    2024年02月10日
    浏览(38)
  • Android-高级-UI-进阶之路-(七)-SVG-基础使用-+-绘制中国地图

    输入搜索动画 利用在线绘制 SVG 图标网站 制作搜索图标 可以自己随意捣鼓绘制,绘制好了之后点击视图-源代码,将 SVG 代码复制出来保存成 search_svg.xml 在线转换 svg2vector 点击空白或者直接将 SVG 拖拽指定区域进行转换 将转换好的 Android 格式的 vector 导入 AS 开始制作动画关联

    2024年03月20日
    浏览(43)
  • Android高级UI进阶之路(七)——SVG基础使用(绘制中国地图)

    Android高级UI进阶之路(一) —— View的基础知识 Android高级UI进阶之路(二) —— 深入理解Android8.0 View的触摸事件分发机制 Android高级UI进阶之路(三) —— 理解View的工作原理及自定义View入门 Android高级UI进阶之路(四) —— Paint渲染滤镜xfermode使用 Android高级UI进阶之路(五) —— Canva

    2024年02月05日
    浏览(30)
  • Flutter笔记:完全基于Flutter绘图技术绘制一个精美的Dash图标(中)

    Flutter笔记 完全基于Flutter绘图技术绘制一个精美的Dart语言吉祥物Dash(中) 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134098877 【介绍】:本文完全基于Flutter绘图技术绘制一个精美的Dash图标(中

    2024年02月06日
    浏览(82)
  • Flutter笔记:完全基于Flutter绘图技术绘制一个精美的Dash图标(上)

    Flutter笔记 完全基于Flutter绘图技术绘制一个精美的Dart语言吉祥物Dash(上) 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134098877 【介绍】:本文完全基于Flutter绘图技术绘制一个精美的Dash图标(上

    2024年02月07日
    浏览(114)
  • Flutter笔记:完全基于Flutter绘图技术绘制一个精美的Dash图标(下)

    Flutter笔记 完全基于Flutter绘图技术绘制一个精美的Dart吉祥物Dash 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134098955 另见: 上上篇文章:《完全基于Flutter绘图技术绘制一个精美的Dart语言吉祥物

    2024年02月07日
    浏览(35)
  • Android-高级-UI-进阶之路-(七)-SVG-基础使用-+-绘制中国地图,Android面试中常问的MMAP到底是啥东东

    iv.setImageDrawable(animatedVectorDrawable) val animatable = iv.drawable as Animatable animatable.start() } } 输入搜索动画 利用在线绘制 SVG 图标网站 制作搜索图标 可以自己随意捣鼓绘制,绘制好了之后点击视图-源代码,将 SVG 代码复制出来保存成 search_svg.xml 在线转换 svg2vector 点击空白或者直接将

    2024年04月25日
    浏览(39)
  • 王力面试(未完全解析)(部分)

    Java对象的创建过程?参考答案 1 , 2 , 3 : 检查类是否已经被加载; 为对象分配内存空间; 为实例变量赋默认值(0或者null);(附1这段代码可证明此步早于实例变量初始化 ) 设置对象头 执行内部生成的 init 方法进行初始化 其中第5步的具体步骤为:递归调用超类构造器----实

    2024年02月13日
    浏览(18)
  • 关于完全背包的解析以及完全背包与01背包的区别及代码

    完全背包是什么呢?如果大家了解过01背包那么完全背包也是可以理解的。完全背包也是求一个固定容量的背包,能够装入物品的最大价值是多少,也就是说该背包最多能装多少价值?和01背包不同的是,完全背包里所能装的各个物品给定是无限的,也就是说同一个物品我们可

    2023年04月09日
    浏览(25)
  • Android.mk 文件使用解析

    和你一起终身学 习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、Android.mk 简介 二、Android.mk 的基本格式 三、Android.mk 深入学习一 四、 Android.mk 深入学习二 五、 Android.mk 深入学习三 六、 Android.mk 判断语句 七、参考文献 Android.mk 是Android 提供的

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包