PorterDuffXfermode 实现刮刮卡效果

今天闲来无事做,就想着巩固一下 PorterDuffXfermode 的使用吧,先是做了圆形和圆角矩形头像效果,然后就做了个刮刮卡效果。如下图所示

当然 PorterDuffXfermode 的详细使用在这里我就不在强调了,可以去 Google 一下,下面主要来介绍一下效果的实现原理。

其实这个效果十分的简单,主要就是 PorterDuffXfermode 模式的设置和 Paint 的属性设置,下面来看看核心代码

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.testpicture);
        mDstBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mSrcBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        mPath = new Path();

        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setAlpha(0);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(50);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        mCanvas = new Canvas(mDstBitmap);
        mCanvas.drawColor(Color.GRAY);

看看 paint 的属性设置,占了代码的 70%,看看都是哪些效果,

首先设置防锯齿效果,将画笔设置成 stroke 模式并且设置宽度为 50,这么设置有什么用呢?这就决定了我们每次滑动,路径的宽度是多少。

至于 StrokeCap 和 StrokeJoin 的属性就是设置让我们的画笔点下去和滑动的时候造成的效果更圆滑,仔细看看上面的效果演示,是不是路径的两端都是圆弧形状。

将 PorterDuffXfermode 设置成 PorterDuff.Mode.DST_IN 模式,然后调用 Canvas.drawColor() 方法,这个时候实际上我们就是完成绘制一个和图像相同大小的灰色区域,也就是我们将要刮去的部分。

这个时候就很奇怪了,只是在 mDstBitmap 上进行绘制,我们并没有 mSrcBitmap ,更别提进行什么操作了,怎么实现效果呢?实际上这个时候我们可以将 mSrcBitmap 虚拟化出来,就当它是存在的,而且是一个透明图,这也就是为什么我们将 画笔的 Alpha 设置为 0,这样我们每次手指滑动的时候实际上就是在动态增加 mSrcBitmap 的面积,那么我们的mDstBitmap 的灰色区域也就被擦除了。

下面看看 OnDraw() 方法

 @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBitmap, 0, 0, null);
        canvas.drawBitmap(mDstBitmap, 0, 0, null);
    }

这个时候一定要画 mBitmap 再画 mDstBitmap ,这样的话就像是 图形我已经画出来了,不过被 mDstBitmap 挡住了,这样当我们滑动的时候,不断擦除 mDstBitmap,也就将图形显示出来了。

下面粘贴出源码,实际上,我们还可以测试图的宽度和长度,对当前屏幕进行适配,以免出现图形大于屏幕,部分图形无法显示的问题,实现起来也不是很复杂,所以在此就不讲述。

public class XferModeView extends View {

    private Bitmap mBitmap;
    private Bitmap mDstBitmap;
    private Canvas mCanvas;
    private Path mPath;
    private Paint paint;

    public XferModeView(Context context) {
        this(context, null);
    }

    public XferModeView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public XferModeView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
    }

    private void initView() {

        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.testpicture);
        mDstBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        mPath = new Path();

        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setAlpha(0);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(50);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        mCanvas = new Canvas(mDstBitmap);
        mCanvas.drawColor(Color.GRAY);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBitmap, 0, 0, null);
        canvas.drawBitmap(mDstBitmap, 0, 0, null);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPath.reset();
                mPath.moveTo(x, y);
                break;
            case MotionEvent.ACTION_MOVE:
                mPath.lineTo(x, y);
                break;
        }

        mCanvas.drawPath(mPath, paint);
        invalidate();
        return true;
    }
}
时间: 2024-10-10 11:11:41

PorterDuffXfermode 实现刮刮卡效果的相关文章

【2014年最后的分享啦】Android实现自定义刮刮卡效果View

一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文<Android实现自定义圆形.圆角和椭圆ImageView(使用Xfermode图形渲染方法)>, 今天我们来看看如何实现电商app里常用到的刮刮卡效果的view组件,其实原理和实现圆角图片的差不多,都是使用Xfermode渲染模式来实现的. (老规矩,源码在博文最后给出哈) 基本原理步骤是这样的

Android 自定义控件实现刮刮卡效果 真的就只是刮刮卡么

很久以前也过一个html5的刮刮卡效果~~上次看到有人写Android的刮刮卡效果~~于是乎产生了本篇博客~~此类例子也比较多了,大家可以百度看看~不过还是通过本例子,带大家发掘一下,里面隐含的知识~ 1.Xfermode以及PorterDuff 如果大家还记得,曾经在博客:完美实现图片圆角和圆形 简单介绍过圆角的实现原理也是基于这个. 首先我们看一下官方的例子,很好的展示了16种Mode的效果: 注:先绘制的Dst,再绘制的Src. 好了,看了这个图,我来问大家几个问题: 问题1.如果我想实现

Android 自己定义控件实现刮刮卡效果 真的就仅仅是刮刮卡么

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40162163 , 本文出自:[张鸿洋的博客] 非常久以前也过一个html5的刮刮卡效果~~上次看到有人写Android的刮刮卡效果~~于是乎产生了本篇博客~~此类样例也比較多了,大家能够百度看看~只是还是通过本样例,带大家发掘一下.里面隐含的知识~ 1.Xfermode以及PorterDuff 假设大家还记得,以前在博客:完美实现图片圆角和圆形 简介过圆角的实现原理也是基于这个

Android 刮刮卡实现效果

实现刮刮卡我们可以Get到哪些技能? * 圆形圆角图片的实现原理 * 双缓冲技术绘图 * Bitmap获取像素值数据 * 获取绘制文本的长宽 * 自定义View的掌握 * 获取屏幕密度 * TypeValue.applyDemension * Canvas的一些绘制方法 * Paint的一些常用的属性 * Path的一些方法 刮刮卡的实现原理图 这里用到了13中模式中的DstOut这种模式. 对于这幅图而言,首先绘制Dst,设置xfermode,再绘制Src. 刮刮卡的实现原理步骤 1.绘制显示

【Android - View】之自定义View实现“刮刮卡”效果

首先来介绍一下这个自定义View: (1)这个自定义View的名字叫做 GuaguakaView ,继承自View类: (2)这个View实现了很多电商项目中的"刮刮卡"的效果,即用户可以刮开覆盖层,查看自己是否中奖: (3)用户可以设置覆盖层的图片以及显示的文本内容和字体大小等参数: (4)用户可以设置一个阈值,当刮开的面积大于这个阈值时,就会自动清除所有覆盖物. 接下来简单介绍一下在这个自定义View中用到的技术点: (1)自定义属性:在 /res/values/attr.xml 

Html5实现移动端、PC端 刮刮卡效果

刮刮卡需求: 每一位用户有三次刮刮卡的机会 本次刮刮卡的结果会覆盖上次的结果 刮刮卡的中奖几率呈现为递增的曲线(保证三次中必须有一次中奖) 刮出的结果包含按钮既(领取奖品 or 再来一次 ) 分享活动奖品升级(这里主要是微信分享的回调了) 我们自己的需求,今天就说怎么制作刮刮卡,有这样需求的可以找我要源码 第一.body创建Canvas <div class="info" id="prize"> <span id="prompt"

使用HTML5实现刮刮卡效果

原文地址:http://www.phpthinking.com/archives/525 你玩过刮刮卡么?一不小心可以中奖的那种.今天我给大家分享一个基于HTML5技术实现的刮刮卡效果,在PC上只需按住鼠标,在手机上你只需按住指头,轻轻刮去图层就可以模拟真实的刮奖效果. 我们利用HTML5的画布Canvas,结合其提供的API,在Canvas元素上绘制一个灰色蒙层,然后通过检测用户鼠标移到和手势来绘制一个透明的图形,这样就能看到Canvas背景下的真实图片,就达到刮刮卡效果. 点击下载源码 HT

用BlendFunc实现舞台灯光和刮刮卡效果

[转]http://code.lovemiao.com/?p=136#more-136 之前写过一篇<不规则形状按钮的点击判定>,利用了CCRenderTexture创建一块画布,可以在上面随意作画,这次,美术同学又本着把程序员折腾到底的态度,提出了又一奇葩需求,由于原需求设计商业机密,这里仅举个同理的例子说明. 附带福利图一张: 神马?没看够?还想看看其他人?请看耐心完全文 要做到上面的效果,glBlendFunc是个很好的选择.glBlendFunc是一个设置图像叠加方式的函数,就是把一张

qt qml 刮刮卡效果

用canvas+mouseArea实现的刮刮卡效果. 表层是一层色彩,用手指划开,可看到下面的文字Lisence: MIT, 请保留本文档说明Author: surfsky.cnblogs.com 2015-02 [先看效果] [下载] http://download.csdn.net/detail/surfsky/8445011 [核心代码] 1 Canvas { 2 id: canvas 3 anchors.fill: parent 4 5 // 6 property bool isFirs