我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android中怎么实现一个刮刮卡效果

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android中怎么实现一个刮刮卡效果

本篇文章为大家展示了Android中怎么实现一个刮刮卡效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、Xfermode

通过使用Xfermode将绘制的图形的像素和Canvas上对应位置的像素按照一定的规则进行混合,形成新的像素,再更新到Canvas中形成最终的图形,使用的时候都是通过Paint.setXfermode来实现。

二、混合模式分类

PorterDuff则是用于描述数字图像合成的基本手法,通过组合使用Porter-Duff操作,可完成任意2D图像的合成。

public class PorterDuff {  // these value must match their native equivalents. See SkPorterDuff.h  public enum Mode {        CLEAR    (0),        class="lazy" data-src     (1),        DST     (2),        class="lazy" data-src_OVER  (3),        DST_OVER  (4),        class="lazy" data-src_IN   (5),        DST_IN   (6),        class="lazy" data-src_OUT   (7),        DST_OUT   (8),        class="lazy" data-src_ATOP  (9),        DST_ATOP  (10),        XOR     (11),        DARKEN   (12),        LIGHTEN   (13),        MULTIPLY  (14),        SCREEN   (15),        ADD     (16),    OVERLAY   (17);    Mode(int nativeInt) {      this.nativeInt = nativeInt;    }        public final int nativeInt;  }

class="lazy" data-src类,优先显示的是源图片。class="lazy" data-src_IN处理图片相交区域时,受到目标图片的Alpha值影响,当我们的目标图片为空白像素的时候,源图片也会变成空白,简单的来说就是用目标图片的透明度来改变源图片的透明度和饱和度,当目标图片的透明度为0时,源图片就不会显示。class="lazy" data-src_OUT用我们目标图片的透明度的补值来改变源图片的透明度和饱和度,当目标图片的透明度为不透明时,源图片就不会显示。class="lazy" data-src_ATOP当透明度为100%和0%时,class="lazy" data-src_IN和class="lazy" data-src_ATOP是通用的,当透明度不为上述的两个值时,class="lazy" data-src_ATOP比class="lazy" data-src_IN源图像的饱和度会增加,变得更亮一些。

DST类,优先显示的是目标图片。DST_IN在相交的时候以源图片的透明度来改变目标图片的透明度和饱和度,当源图片的透明度为0的时候,目标图片完全不显示。

其它的叠加效果,MULTIPLY可以把图片的轮廓取出来,LIGHTEN变亮效果。

三、刮刮卡效果

效果图

Android中怎么实现一个刮刮卡效果

实现思路
利用PorterDuffXfermode中的模式class="lazy" data-src_OUT,先绘制最终呈现的图片并将图层保存起来,然后将手指移动的轨迹渲染到画布上,并绘制目标图片到画布上,最后用目标图片的透明度的补值来改变源图片的透明值,将最终呈现的图片显示在屏幕上。

代码实例

public class GuaCardView extends View {  private Bitmap mclass="lazy" data-srcText;  private Bitmap mclass="lazy" data-srcBitmap;  private Bitmap mDstBitmap;  private Paint mPaint;  private Path mPath;  private float mStartX,mStartY;  public GuaCardView(Context context, AttributeSet attrs) {    super(context, attrs);    setLayerType(LAYER_TYPE_SOFTWARE,null);    mPaint = new Paint();    mPaint.setColor(Color.RED);    mPaint.setStyle(Paint.Style.STROKE);    mPaint.setStrokeWidth(45);    mclass="lazy" data-srcText = BitmapFactory.decodeResource(getResources(), R.drawable.guaguaka_text1);    mclass="lazy" data-srcBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.guaguaka);    mDstBitmap = Bitmap.createBitmap(mclass="lazy" data-srcBitmap.getWidth(),mclass="lazy" data-srcBitmap.getHeight(), Bitmap.Config.ARGB_8888);    mPath = new Path();  }  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    //画最终呈现的图    canvas.drawBitmap(mclass="lazy" data-srcText,0,0,mPaint);    int layerId = canvas.saveLayer(0,0,getWidth(),getHeight(),null,Canvas.ALL_SAVE_FLAG);    //把手指轨迹画到画布上    Canvas c = new Canvas(mDstBitmap);    c.drawPath(mPath,mPaint);    //利用class="lazy" data-src_OUT绘制原图    canvas.drawBitmap(mDstBitmap,0,0,mPaint);    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.class="lazy" data-src_OUT));    canvas.drawBitmap(mclass="lazy" data-srcBitmap,0,0,mPaint);    mPaint.setXfermode(null);    canvas.restoreToCount(layerId);  }  @Override  public boolean onTouchEvent(MotionEvent event) {    switch(event.getAction()){      case MotionEvent.ACTION_DOWN:        mPath.moveTo(event.getX(),event.getY());        mStartX = event.getX();        mStartY = event.getY();        return true;      case MotionEvent.ACTION_MOVE:        float endX = (mStartX+event.getX())/2;        float endY = (mStartY+event.getY())/2;        mPath.quadTo(mStartX,mStartY,endX,endY);        mStartX = event.getX();        mStartY = event.getY();        break;      default:        break;    }    postInvalidate();    return super.onTouchEvent(event);  }}以

上述内容就是Android中怎么实现一个刮刮卡效果,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android中怎么实现一个刮刮卡效果

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中怎么实现一个刮刮卡效果

本篇文章为大家展示了Android中怎么实现一个刮刮卡效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、Xfermode 通过使用Xfermode将绘制的图形的像素和Canvas上对应位置的像素
2023-05-30

Android刮刮卡效果实现代码

本文实例为大家分享了Android刮刮卡效果,供大家参考,具体内容如下android实现底层一张图片,上层一个遮罩层,触摸滑动按手指滑动路径实现去除遮罩效果,类似于抽奖的刮刮卡一样,不多说先上张效果图:直接上代码:XfermodeView.
2022-06-06

使用canvas怎么绘制一个刮刮卡效果

使用canvas怎么绘制一个刮刮卡效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。代码 2023-06-07

怎么用JavaScript canvas实现刮刮效果

本篇内容主要讲解“怎么用JavaScript canvas实现刮刮效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用JavaScript canvas实现刮刮效果”吧!具体内容如下HTML
2023-06-25

Android App中实现简单的刮刮卡抽奖效果的实例详解

主要思想: 将一个view设计成多层:背景层,含中奖信息等; 遮盖层,用于刮奖,使用关联一个Bitmap的Canvas 在该Bitmap上,使用它的canvas.drawPath的api来处理 手势滑动(类似刮奖的动作) 使用paint.s
2022-06-06

基于Android自定义控件实现刮刮乐效果

只是简单的实现了效果,界面没怎么做优化,不过那都是次要的啦!!相信大家都迫不及待的想看效果图了吧,其中主要的彩票视图类和橡皮擦类都是通过代码的方式构建视图,布局文件就一个主activity_main上代码!!主activity:packa
2022-06-06

Html5中Canvas实现一个“刮刮乐”游戏的方法

小编给大家分享一下Html5中Canvas实现一个“刮刮乐”游戏的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!之前公司项目有一个刮奖小游戏的需求,因此有了本
2023-06-09

JS如何实现canvas仿ps橡皮擦刮卡效果

这篇文章主要介绍了JS如何实现canvas仿ps橡皮擦刮卡效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。效果演示:主要JS代码实现
2023-06-25

轻松实现功能强大的Android刮奖效果控件(ScratchView)

前言 我身边有一部分开发的小伙伴,存在着这样一种习惯。某一天,突然看到某一款 App 上有个很漂亮的自定义控件(动画)效果,就会绞尽脑子想办法去自己实现一发。当然,我自己也是属于这类型的骚年,看到某种效果就会手痒难耐琢磨着实现套路。个人觉得
2022-06-06

Android中怎么实现一个倒计时效果

今天就跟大家聊聊有关Android中怎么实现一个倒计时效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。需求:a.在后台添加时,如果是今日直播,则需要添加开始时间(精确到秒);b.离
2023-05-30

Android应用中怎么实现一个抽屉效果

这篇文章将为大家详细讲解有关Android应用中怎么实现一个抽屉效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先在layout 下设置xml布局文件
2023-05-31

Android中怎么实现一个炫酷进度条效果

这期内容当中小编将会给大家带来有关Android中怎么实现一个炫酷进度条效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。HorizontalProgressbarWithProgress的代码impor
2023-05-30

怎么在Android应用中实现一个动画效果

本篇文章给大家分享的是有关怎么在Android应用中实现一个动画效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android 三种动画详解帧动画一张张图片不断的切换,形成动
2023-05-31

怎么在Android应用中实现一个抽屉效果

怎么在Android应用中实现一个抽屉效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现原理其实单就一个SwipeLayout的实现原理来讲的话,还是很简单
2023-05-31

怎么在Android中实现一个花瓣飘落效果

这篇文章给大家介绍怎么在Android中实现一个花瓣飘落效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录