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

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

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

Kotlin 复制代码
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.AppCompatImageView


class MyView : AppCompatImageView {
    private var WIDTH = 0
    private var HEIGHT = 0

    private var mPaint: Paint = Paint()
    private var mBmpText: Bitmap
    private var mBmpDst: Bitmap
    private var mBmpSrc: Bitmap
    private var mPath: Path
    private var mPreX = 0f
    private var mPreY = 0f
    private var mPorterDuffXfermode: PorterDuffXfermode
    

    constructor(ctx: Context, attributeSet: AttributeSet) : super(ctx, attributeSet) {
        mPaint.style = Paint.Style.STROKE
        mPaint.strokeWidth = 30f

        mBmpText = BitmapFactory.decodeResource(resources, R.mipmap.name, null)
        mBmpSrc = BitmapFactory.decodeResource(resources, R.mipmap.pic, null)

        WIDTH = mBmpSrc.width
        HEIGHT = mBmpSrc.height

        //空的Bitmap
        mBmpDst = 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)

        //绘制Path
        canvas.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.x
                mPreY = event.y

                return true
            }

            MotionEvent.ACTION_MOVE -> {
                val endX = (mPreX + event.x) / 2
                val endY = (mPreY + event.y) / 2
                mPath.quadTo(mPreX, mPreY, endX, endY)
                mPreX = event.x
                mPreY = event.y
            }

            MotionEvent.ACTION_UP -> {

            }
        }

        postInvalidate()

        return super.onTouchEvent(event)
    }
}

如果把mode设置为:

Kotlin 复制代码
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

相关推荐
vocal15 分钟前
【我的AOSP第一课】AOSP 下载、编译与运行
android
Lei活在当下1 小时前
【业务场景架构实战】8. 订单状态流转在 UI 端的呈现设计
android·设计模式·架构
小趴菜82271 小时前
Android中加载unity aar包实现方案
android·unity·游戏引擎
qq_252924191 小时前
PHP 8.0+ 现代Web开发实战指南 引
android·前端·php
Jeled1 小时前
Android 本地存储方案深度解析:SharedPreferences、DataStore、MMKV 全面对比
android·前端·缓存·kotlin·android studio·android jetpack
宝杰X73 小时前
Compose Multiplatform+Kotlin Multiplatfrom 第七弹跨平台 AI开源
人工智能·开源·kotlin
2501_915918417 小时前
掌握 iOS 26 App 运行状况,多工具协作下的监控策略
android·ios·小程序·https·uni-app·iphone·webview
寒山李白8 小时前
关于Java项目构建/配置工具方式(Gradle-Groovy、Gradle-Kotlin、Maven)的区别于选择
java·kotlin·gradle·maven
2501_9159090610 小时前
iOS 混淆实战,多工具组合完成 IPA 混淆与加固(源码 + 成品 + 运维一体化方案)
android·运维·ios·小程序·uni-app·iphone·webview