Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现“刮刮乐”效果,Kotlin(2)

news/2024/12/24 10:22:55/

Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现“刮刮乐”效果,Kotlin(2)

在 Android使用PorterDuffXfermode的模式PorterDuff.Mode.SRC_OUT实现橡皮擦,Kotlin(1)-CSDN博客文章浏览阅读516次,点赞7次,收藏8次。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android Bitmap保存成至手机图片文件,Kotlin_android bitmap保存图片-CSDN博客。Android Canvas画布saveLayer与对应restoreToCount,Kotlin_android canvas.savelayer-CSDN博客。https://blog.csdn.net/zhangphil/article/details/144535808

基础上,稍作改动,实现一种刮刮乐的效果:

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Path
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.appcompat.widget.AppCompatImageViewclass MyView : AppCompatImageView {private var WIDTH = 0private var HEIGHT = 0private var mPaint: Paint = Paint()private var mBmpText: Bitmapprivate var mBmpDst: Bitmapprivate var mBmpSrc: Bitmapprivate var mPath: Pathprivate var mPreX = 0fprivate var mPreY = 0fprivate var mPorterDuffXfermode: PorterDuffXfermodeconstructor(ctx: Context, attributeSet: AttributeSet) : super(ctx, attributeSet) {mPaint.style = Paint.Style.STROKEmPaint.strokeWidth = 30fmBmpText = BitmapFactory.decodeResource(resources, R.mipmap.name, null)mBmpSrc = BitmapFactory.decodeResource(resources, R.mipmap.pic, null)WIDTH = mBmpSrc.widthHEIGHT = mBmpSrc.height//空的BitmapmBmpDst = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888)mPath = Path()/**** SRC_OUT** 当目标图像有图像时合成结果为空白像素;* 当目标图像没有图像时,合成结果显示源图像;* 如果把手指Path做为目标图像,在与源图像合成时,有手指轨迹的地方就变为空白像素,效果就是擦除。**/mPorterDuffXfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)}override fun onDraw(canvas: Canvas) {//第一层,底图,文字。canvas.drawBitmap(mBmpText, 0f, 0f, null)val layerId = canvas.saveLayer(0f, 0f, WIDTH.toFloat(), HEIGHT.toFloat(), null)//第二层,绘制盖在第一层底图上面的图,这层是要被橡皮擦擦除的。canvas.drawBitmap(mBmpDst, 0f, 0f, null)//绘制Pathcanvas.drawPath(mPath, mPaint)//合成图像mPaint.setXfermode(mPorterDuffXfermode)canvas.drawBitmap(mBmpSrc, 0f, 0f, mPaint)mPaint.setXfermode(null)canvas.restoreToCount(layerId)}override fun onTouchEvent(event: MotionEvent): Boolean {when (event.action) {MotionEvent.ACTION_DOWN -> {mPath.moveTo(event.x, event.y)mPreX = event.xmPreY = event.yreturn true}MotionEvent.ACTION_MOVE -> {val endX = (mPreX + event.x) / 2val endY = (mPreY + event.y) / 2mPath.quadTo(mPreX, mPreY, endX, endY)mPreX = event.xmPreY = event.y}MotionEvent.ACTION_UP -> {}}postInvalidate()return super.onTouchEvent(event)}
}

如果把mode设置为:

PorterDuff.Mode.SRC_ATOP

会产生一种奇特的效果,开始时候只有红色的名字图,随着手指在界面上滑动,会把上面的大的山水古风风格的图画一道道擦出来,就像冬天的窗户,手指滑动擦除窗花,窗户外的镜像一道道显示出来。

Android使用PorterDuffXfermode的模式PorterDuff.Mode.SRC_OUT实现橡皮擦,Kotlin(1)-CSDN博客文章浏览阅读820次,点赞8次,收藏10次。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android Bitmap保存成至手机图片文件,Kotlin_android bitmap保存图片-CSDN博客。Android Canvas画布saveLayer与对应restoreToCount,Kotlin_android canvas.savelayer-CSDN博客。https://blog.csdn.net/zhangphil/article/details/144535808

Android Canvas图层saveLayer剪切clipRect原图对应Rect区域,Kotlin(1)_canvas savelayer cliprect-CSDN博客文章浏览阅读1k次,点赞21次,收藏22次。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android Bitmap保存成至手机图片文件,Kotlin_android bitmap保存图片-CSDN博客。Android画布Canvas裁剪clipRect,Kotlin-CSDN博客。_canvas savelayer cliprecthttps://blog.csdn.net/zhangphil/article/details/135297013Android Canvas画布saveLayer与对应restoreToCount,Kotlin_android canvas.savelayer-CSDN博客文章浏览阅读986次,点赞8次,收藏8次。文章浏览阅读9.6k次。文章浏览阅读1.8k次。/*Java代码 将Drawable转化为Bitmap */ Bitmap drawableToBitmap(Drawable drawable) { int width = drawable.getIntrinsicWidth();Android Material Design :LinearLayoutCompat添加分割线divider_linearlayout 分割线-CSDN博客。_android canvas.savelayerhttps://blog.csdn.net/zhangphil/article/details/135131896


http://www.ppmy.cn/news/1557714.html

相关文章

实战设计模式之抽象工厂模式

概述 前一篇文章中提到的工厂方法模式允许子类决定具体要创建的对象类型,但它一次只创建一个对象。抽象工厂模式则更加复杂,它关注的是创建一系列相关的对象。这些对象通常构成了一个完整的“家族”,并且在不同的实现中保持一致性和兼容性。 …

基于自定义注解与 AOP 切面实现接口日志全面数据库存储

基于自定义注解与 AOP 切面实现接口日志全面数据库存储 一、引言 在当今复杂的软件系统开发与运维过程中,详细且精准地记录接口的各项信息对于系统性能监测、问题排查、安全审计以及业务分析都有着极为关键的意义。本文将深入讲解如何运用自定义注解与 AOP&#x…

C# Winform简单的俄罗斯方块小游戏源码2

文章目录 一、设计来源俄罗斯方块小游戏讲解1.1 主界面1.2 游戏界面1.3 游戏结束界面1.4 游戏积分界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/…

STM32基于标准库如何查看时钟主频,100%简单

基于原有的工程写入两行代码,见下图 RCC_ClocksTypeDef get_rcc_clock; RCC_GetClocksFreq(&get_rcc_clock); 进入我们的仿真加入断点,然后在watch1观察变量值数据,然后在计算器计算就能得出,如上图。 但是这样看的PAB1上…

搭建简易版本的git私有仓库--运用git和gitea

诉求 在公司和在家会进行个人java项目的编写,同一项目便于集中管理,同步版本,打算搭建私有的Git服务供个人学习和练习使用。 基本情况 Windows系统且未安装过Git 一、下载安装git git下载地址 下载完毕直接安装: 最后一步去…

Springboot(五十五)SpringBoot整合ELK实现日志可视化

首先我们先来解析一下,什么是ELK:E:elasticsearch、L:logstash、K:kibana 关于他们的部署,请移步 《docker(十五)docker-compose部署elasticsearch配置账号密码登录》 要先部署elasticsearch,在部署logstash,部署logstash需要用到es的账号和密码。 《docker(二十…

PostgreSQL 的历史

title: PostgreSQL 的历史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能强大且广泛使用的开源关系型数据库管理系统。其历史可以追溯到1986年,当时由加州大学伯克利分校的一个研究团队开发。文章将深入探讨 PostgreSQL 的起源、…

django中cookie与session的使用

一、cookie cookie由服务器生成 ,存储在浏览器中的键值对数据,具有不安全性,对应敏感数据应该加密储存在服务端每个域名的cookie相互独立浏览器访问域名为A的url地址,会把A域名下的cookie一起传递到服务器cookie可以设置过期时间 django中设…