Android自定义View-刮刮卡效果

android刮刮卡效果实现 android刮刮卡效果实现Demo,包含圆形图片的实现 立即下载

首先来看一下效果图:(这是医生的书《Android群英传》中的一个知识点)

刮刮卡效果

 涉及到的知识点
 1. [2D绘图基础](http://blog.youkuaiyun.com/zone_/article/details/70456348)
 2. PorterDuffXfermode

绘制思路:

  1. 绘制两个图层,第一层绘制想要显示的图案,第二层绘制遮罩层(这两个图层中,是第二个图层覆盖第一个图层)
  2. 让手指滑过的地方变成透明,就可以看到第一层的图片了。

第一步:绘制两个图层

先来看一下第一步绘制好之后的效果:

这里写图片描述

首先是初始化一些数据:
成员变量:

private Paint mTransparentPaint;//透明的画笔
private Path mFingerPath;//记录手指滑过的路径
private Bitmap mBgBitmap;//第一张图的 bitmap
private Bitmap mFgBitmap;//第二章图的 bitmap
private Canvas mCanvas1;//新建的画布,用于操作 mFgBitmap

构造方法中初始化的数据:

mTransparentPaint = new Paint();//设置透明画笔
mTransparentPaint.setAntiAlias(true);
mTransparentPaint.setAlpha(0);//设置成透明
mTransparentPaint.setStyle(Paint.Style.STROKE);
mTransparentPaint.setStrokeJoin(Paint.Join.ROUND);//让笔触和连接处更加圆滑
mTransparentPaint.setStrokeCap(Paint.Cap.ROUND);
mTransparentPaint.setStrokeWidth(50);
mTransparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

mFingerPath = new Path();//记录手指滑过的路径
mBgBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.qq2);//第一张图
mFgBitmap = Bitmap.createBitmap(mBgBitmap.getWidth(), mBgBitmap.getHeight(), Bitmap.Config.ARGB_8888);//第二章图
mCanvas1 = new Canvas(mFgBitmap);//mCanvas1 画布进行的一些列操作都会作用到 mFgBitmap
mCanvas1.drawColor(Color.GRAY);//例如这一步,绘制灰色,会使 mFgBitmap 变成一张全灰色的 bitmap

在 onDraw() 方法中绘制两个 bitmap :

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(mBgBitmap, 0,0, null);
    canvas.drawBitmap(mFgBitmap, 0,0, null);
}

第二步:让手指滑过的地方变透明

这里需要重写 onTouchEvent(),来记录手指滑过的路径 ,那么重写之后的代码是这样的:

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mFingerPath.reset();//因为之前的效果已经作用在 fgBitmap 上了,所以需要重置 path ,避免对下一步造成影响
            mFingerPath.moveTo(event.getX(), event.getY());
            break;
        case MotionEvent.ACTION_MOVE:
            mFingerPath.lineTo(event.getX(), event.getY());
            break;
        case MotionEvent.ACTION_UP:

            break;
    }
    mCanvas1.drawPath(mFingerPath, mTransparentPaint);//使透明的效果作用到 fgBitmap 上。
    invalidate();//执行重绘
    return true;
}

总结

经过上面的两步绘制,就可以实现刮刮卡的效果了,其实自定义 view 就是坐标的计算和实现思路。那么完整的代码是下面这样的:

public class ScratchCardView extends View {
    private Paint mTransparentPaint;//透明的画笔
    private Path mFingerPath;//手指的路径
    private Bitmap mBgBitmap;//第一张图的 bitmap
    private Bitmap mFgBitmap;//第二章图的 bitmap
    private Canvas mCanvas1;//新建的画布,用于操作 mFgBitmap

    public ScratchCardView(Context context) {
        super(context);
        init();
    }

    public ScratchCardView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ScratchCardView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public ScratchCardView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    private void init() {
        mTransparentPaint = new Paint();//设置透明画笔
        mTransparentPaint.setAntiAlias(true);
        mTransparentPaint.setAlpha(0);//设置成透明
        mTransparentPaint.setStyle(Paint.Style.STROKE);
        mTransparentPaint.setStrokeJoin(Paint.Join.ROUND);//让笔触和连接处更加圆滑
        mTransparentPaint.setStrokeCap(Paint.Cap.ROUND);
        mTransparentPaint.setStrokeWidth(50);
        mTransparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

        mFingerPath = new Path();//记录手指滑过的路径
        mBgBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.qq2);//第一张图
        mFgBitmap = Bitmap.createBitmap(mBgBitmap.getWidth(), mBgBitmap.getHeight(), Bitmap.Config.ARGB_8888);//第二章图
        mCanvas1 = new Canvas(mFgBitmap);//mCanvas1 画布进行的一些列操作都会作用到 mFgBitmap
        mCanvas1.drawColor(Color.GRAY);//例如这一步,绘制灰色,会使 mFgBitmap 变成一张全灰色的 bitmap
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mFingerPath.reset();//因为之前的效果已经作用在 fgBitmap 上了,所以需要重置 path ,避免对下一步造成影响
                mFingerPath.moveTo(event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_MOVE:
                mFingerPath.lineTo(event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_UP:

                break;
        }
        mCanvas1.drawPath(mFingerPath, mTransparentPaint);//使透明的效果作用到 fgBitmap 上。
        invalidate();//执行重绘
        return true;
    }
}

好了,我们一步一步实现了最终效果,如果文中有什么知识点是错误的或者更好的实现方法,请及时联系我进行修改,以免误导别人。谢谢。

android实战 刮刮卡(android studio源程序工程) 包括Android 移动开发基础案例教程课本中第十章实战演练——刮刮卡的源代码,可用Android studio运行,适合初学者学习。 立即下载

相关推荐

LVGL高效加载外部Flash图片资源的实现与优化

本文深入探讨了在嵌入式UI开发中,如何为LVGL高效加载外部Flash中的图片资源。针对内部Flash容量不足的痛点,详细解析了LVGL的图片处理原理,并对比了内存映射与流式解码两种主流实现方案。文章重点提供了性能优化技巧与实战避坑指南,旨在帮助开发者实现流畅的图片加载体验,解决SPI Flash读取慢、内存占用高等核心挑战。

t1u2v的博客 462

刮刮卡android代码,简单实现Android刮刮卡效果

本文实例为大家分享了Android仿刮刮卡效果展示的具体代码,供大家参考,具体内容如下一、Xfermode通过使用Xfermode将绘制的图形的像素和Canvas上对应位置的像素按照一定的规则进行混合,形成新的像素,再更新到Canvas中形成最终的图形,使用的时候都是通过Paint.setXfermode来实现。二、混合模式分类PorterDuff则是用于描述数字图像合成的基本手法,通过组合使用P...

weixin_30119251的博客 636

YOLO11实战 第001期-基于yolo11的CrowdHuman密集行人目标检测实战文档(yolo格式数据免费获取)

1.数据阶段在拥挤/遮挡场景下,使用crowdhuman数据集重训练后的yolo11,效果表现较好。crowdhuman数据集标签如下,有Head BBox、Visible BBox、Full BBox。如下图显示:数据集介绍CrowdHuman数据集是旷世发布的用于行人检测的数据集,图片数据大多来自于google搜索。CrowdHuman数据集数据量比较大,15000张,5000张,验证集4370张。训练集和验证集中共有470K个实例,约每张图片包含23个人,同时存在各种各样的遮挡。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 2166

Android开发之自定义刮刮卡实现代码

首先我们需要知道任何的控件在Android的布局中外层都是一个矩形的,A代表刮刮卡绘制区域,B代表中奖信息绘制区域,所以在这里我们绘制文本信息的起始点应该是A布局宽的一半减去B布局宽的一半,同理,高也应该是A布局高的一半减去B布局高的一半,这里我们把B布局,也就是文字控件的大小信息用一个Rect对象来存储,而这里的A布局即为Bitmap背景图的大小。其实非常简单,首先我们需要确定所要绘图的区域,然后对这块区域进行多层的绘图(背景层,前景层),然后去监听触摸事件,把手指触摸的区域的前景层给消除即可。...

wuxiaopengnihao1的博客 736

windchill安装搭建(保姆式)

保姆式搭建windchill 材料准备 Vmware工具,用来创建和打开虚拟机的工具 安装系统的镜像文件 数据库安装文件,这里是Oracle数据库 Windchill的安装包 Vmware工具,用来安装和打开虚拟机的软件 Windowsserver2008的镜像工具,用来安装虚拟机环境的系统,如果你有win2007或win2010的也可以,在做虚拟机时,需要先安装系统。 Oracle数据库安装包 Windchill11M030的安装包 (安装包如有需要可以私信邮箱发送) 虚拟机安装 安装虚拟机VMware

tr1294937662的博客 6217

浅谈MOS管的发热原因和解决办法

解读一下开关管发热原因,解决方案和开关损耗测试。

qq_45508321的博客 1万+

Android 使用PorterDuff实现刮刮卡效果,4个改变你编程技能的小技巧

import android.graphics.Bitmap.Config; import android.graphics.Paint.Style; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff.Mode; import android.

m0_64604842的博客 547

【100%通过率】华为OD机试真题 Python【数字最低位排序】【最低位排序】

2023华为OD机试真题 Python【数字最低位排序】【最低位排序】 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位

MISAYAONE的博客 1902

android刮奖控件,[Android]一个高自由度的刮刮卡刮奖效果Demo

本Demo旨在实现刮刮卡效果,优点是可自由实现刮层下的内容,附赠一个可随路径移动的橡皮擦。在写正文之前,先感谢一下鸿洋大神的【Android 自定义控件实现刮刮卡效果 真的就只是刮刮卡么】这篇文章,此文章手把手教你实现一个刮刮卡效果,有助于从0开始理解刮奖效果是怎么实现的(绝大多数的刮奖效果实现原理是一样的)。效果图trimmedVideo_eo_20190726_175154.gif实现刮奖效果...

weixin_39637256的博客 289

DCMM评估报告模板样例

这篇DCMM评估报告对某数据管理公司2020年的数据管理能力进行了全面分析。报告显示,该公司在数据战略方面取得初步进展,但在数据治理和数据架构方面仍存在明显不足,包括缺乏有效治理流程、数据质量监控不足,以及数据标准化和转换灵活性不足等问题。评估报告提出了针对性改进建议,包括完善数据战略、建立治理流程、加强质量监控和提升数据转换灵活性等,为提升数据管理成熟度提供了重要指导。

cdfunlove的博客 166

化工设计软件:PDMS二次开发_(7).数据导入与导出技术

在某些复杂场景下,PDMS提供的标准API接口可能无法满足需求。此时,可以通过自定义API接口来实现特定的数据导入与导出功能。自定义设备导入API接口可以处理更复杂的设备数据格式。# 导入必要的库import pdms_api # 假设有一个PDMS API库# 定义自定义设备数据# 自定义设备导入API接口# 调用自定义设备导入API接口# 输出导入成功的消息print("自定义设备数据导入成功")在PDMS二次开发中,数据的导入与导出是关键的技术环节。

kkchenjj的博客 1486

Android自定义View--刮刮卡效果

我最近悟出了一个道理:“学习感觉时间过的很慢,玩游戏感觉时间过的很快,因为学习让我度日如年啊!想要活的长的话要多学习··· 不光如此,学习还治好了我的失眠症,我看书一会就瞌睡了。” 所以:学习是个好东西。 按照惯例先上效果 ...

yanwenyuan0304的专栏 353

(论文加源码)基于CNN和LSTM的脑电情绪识别(数据集为DEAP和seed)

论文及源码见个人主页:https://download.youkuaiyun.com/download/qq_45874683/84118637?spm=1001.2014.3001.5503 (论文加源码)基于CNN和LSTM的脑电情绪识别(数据集为DEAP和seed)4D-CRNN 目录 目录: 运行过程: 1. 运行1D文件(没有什么bug): 2. 再运行3D文件(没有出现bug): 3. 最后运行main文件(出现了两个bug)(前提需要配置好tensorflow的框架): 第一个bug是..

qq_45874683的博客 6366

安卓自定义view实现彩票刮刮卡效果

欢迎来到亮亮的博客我是一名在校大学生,目前学的是软件,今天我的个人微博也算是开通了,那么我要说的第一个就是我自己研究的安卓,在看自定义view这块时,我特意去找了几位大神的博客看了下,有一位是专门研究底层代码的,也就是api,他把安卓的系统组件源码全都挖出来了,这是他的博客地址:http://blog.youkuaiyun.com/yanbober/article/details/46128379 。对代码比较

qq_27607229的博客 618

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android自定义View之刮刮卡效果

Android自定义View之刮刮卡效果

sqyNick 526

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android 自定义View 实现刮刮卡效果

主要思想: 将一个view设计成多层:背景层,含中奖信息等; 遮盖层,用于刮奖,使用关联一个Bitmap的Canvas 在该Bitmap上,使用它的canvas.drawPath的api来处理 手势滑动(类似刮奖的动作) 使用paint.setXfermode 来进行消除手势滑动区域 /** * author : stone * email : aa8679

打渔还是晒网 —— stone 1997

android 自定义view实现刮刮卡效果

android 自定义view实现刮刮卡效果

zhouguizhi 1574

Android自定义View——刮刮卡效果

刮刮卡效果 效果图: 想要红包的实现效果的可以关注我的博客仿饿了么红包 实现原理: 下层为我们的红包图片 上层为我们灰色的颜色 使用滑动监听,滑动时,用透明度为0的画笔画出透明和上层图片灰色的交集 监听我们滑动的距离是否达到标准,达到后使用子线程自动展开剩余的灰色 实现步骤: 初始化画笔 初始化顶层图片和底层图片 监听滑动事件,判断是否滑完

点击置顶文章查看博客目录(全站式导航) 2888

Android自定义View—刮刮卡效果

前言:在电商中,常用到一些劵和红包之类,往往是通过刮刮卡效果实现,本文来自Hensn_授权本公众号独家发布, Hensen_的csdn博客链接为:http://blog.youkuaiyun.com...

欢迎关注公众号:【码农突围】,公号后台回复9999,可以获取一份500页的LeetCode刷题笔记。 441

Android 实现刮刮卡效果

因为项目需求一个刮刮卡效果的抽奖页面,然后就自己写一个刮刮卡效果的自定义view,基本可以满足产品的需求吧,正好周末,就把这个干货分享给大家,主要是通过Paint和Canvas来实现,喜欢的小伙帮们,可以看下。 上效果图: 原理:自定义的View是继承TextView的,所以文字和背景图片我们可以直接设置,刮奖区这个图片是通过Canvas画上去的,手指移动刮开是通过Paint来实现的。然后每次刮完

熊大巍搬砖记 954

自定义View2 刮刮卡效果

效果如下图: 这里需要用到上一节中PorterDuffXfermode(把传递改头换面的服务员) xfermode 内容请参考http://note.youdao.com/share/?id=3f61125240ed4553df90532d42192ccb&type=note 刮刮需要用到的是Xor的效果。 刮刮卡的自定义view public cla

heinika的专栏 631

Android 自定义View之PorterDuffXfermode的使用(刮刮卡的效果实现)

回想一下,在刮奖的时候的那个效果,怎么实现的呢,我们来看一下简单的实现方法。 这里我们要用到画笔特效处理中的PorterDuffXfermode来实现这个效果。在学习PorterDuffXfermode之前,先看看看这张图: 图来自API demo。基本上讲PorterDuffXfermode的文章都引用了该图,类似于取并集,交集的概念。 它控制了两个图像之间的混合现实模式。注意:Porter

Hedong的博客 902

Android 自定义view《八》 橡皮擦效果实现刮刮卡效果实现 Colorfilter、setXfermode,Shader,bitmapShader,PorterDuffXfermod

一.ColorMatrix Android中的色彩矩阵 色彩矩阵对于色彩的存储,Bitmap类使用一个32位的数值来保存。红、绿、蓝及透明度各占8位,每一个色彩分量的取值范围是0-255。透明度为0表示完全透明,为255时,色彩完全可见。 使用方法:paint的函数 paint.setColorFilter(new ColorMatrixColorFilter(mSaturationMa...

深南大盗的博客 539

自定义View--刮刮卡

效果图: 原理:最上层是一个(颜色值为#cococo)bitmap,中间是一个画笔在画布上花下用户滑动的路径,最下层是一个背景图片的bitmap(见下图) 具体绘制的代码如下: @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(mOutterBitmap, 0, 0, null);//

android程序猿HJ的博客 3465
上一篇: Android群英传读书笔记-2D绘图基础
下一篇: Android自定义View-蜘蛛网属性图(五边形图)
zone7_
博客等级 码龄10年 144粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值