经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android刮刮乐效果-proterDuffXfermode
来源:cnblogs  作者:拖鞋王子猪  时间:2020/12/21 14:45:52  对本文有异议

Android刮刮乐效果-proterDuffXfermode

先看看实现的效果
效果展示这个场景主要是模拟我们有些app里面的刮刮乐中奖的效果,主要是利用Android的proterDuffXfermode这个类去实现的。

proterDuffXfermode

在用Android中的Canvas进行绘图时,可以通过使用PorterDuffXfermode将所绘制的图形的像素与Canvas中对应位置的像素按照一定规则进行混合,形成新的像素值,从而更新Canvas中最终的像素颜色值,这样会创建很多有趣的效果。PorterDuffXfermode的功能十分的强大,其他的应用场景这里就不多介绍,主要是看,刮刮乐的实现和原理。

  1. public class PorterDuffXfermode extends Xfermode

PorterDuffXfermode 继承了Xfermode,使用的时候注意的API是Paint.setXfermode(Xfermode xfermode)。
PorterDuffXfermode支持以下十几种像素颜色的混合模式,分别为:CLEAR、SRC、DST、SRC_OVER、DST_OVER、SRC_IN、DST_IN、SRC_OUT、DST_OUT、SRC_ATOP、DST_ATOP、XOR、DARKEN、LIGHTEN、MULTIPLY、SCREEN。
这里是使用PorterDuff.Mode.DST_IN,取两层绘制交集,显示下层。这个模式,来进行操作的。
在这里插入图片描述

  • 自定义view继承ImageView
    代码比较少,我就直接来了
  1. public class ProterDuffXfermodeView extends AppCompatImageView {
  2. private Bitmap mBgBitmap,mFgBitmap;
  3. private Paint mPaint;
  4. private Canvas mCanvas;
  5. private Path mPath;
  6. public ProterDuffXfermodeView(Context context, AttributeSet attrs) {
  7. super(context,attrs);
  8. init();
  9. }
  10. private void init() {
  11. //创建Paint
  12. mPaint=new Paint();
  13. //设置透明度
  14. mPaint.setAlpha(0);
  15. //设置Xfermode模式
  16. mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
  17. //Paint类型
  18. mPaint.setStyle(Paint.Style.STROKE);
  19. //Paint.Join.MITER-锐角,ROUND-圆弧,BEVEL-直线
  20. mPaint.setStrokeJoin(Paint.Join.ROUND);
  21. mPaint.setStrokeWidth(50);
  22. //线帽
  23. mPaint.setStrokeCap(Paint.Cap.ROUND);
  24. mPath=new Path();
  25. Drawable drawable =getDrawable();
  26. mBgBitmap=((BitmapDrawable)drawable).getBitmap();
  27. mFgBitmap=Bitmap.createBitmap(mBgBitmap.getWidth(),mBgBitmap.getHeight(),Bitmap.Config.ARGB_8888);
  28. mCanvas=new Canvas(mFgBitmap);
  29. mCanvas.drawColor(Color.GRAY);
  30. }
  31. @Override
  32. public boolean onTouchEvent(MotionEvent event) {
  33. switch (event.getAction()) {
  34. case MotionEvent.ACTION_DOWN:
  35. mPath.reset();
  36. mPath.moveTo(event.getX(), event.getY());
  37. break;
  38. case MotionEvent.ACTION_MOVE:
  39. mPath.lineTo(event.getX(), event.getY());
  40. break;
  41. }
  42. mCanvas.drawPath(mPath, mPaint);
  43. invalidate();
  44. return true;
  45. }
  46. @Override
  47. protected void onDraw(Canvas canvas) {
  48. canvas.drawBitmap(mBgBitmap, 0, 0,null);
  49. canvas.drawBitmap(mFgBitmap, 0, 0,null);
  50. }
  51. }

首先有两个bitmap,一个是背景(刮刮乐的照片),一个是前置的(灰色遮挡)。
这里解释一下几个API

  1. //设置画笔的样式
  2. mPaint.setStyle(Paint.Style.FILL);//填充内容
  3. mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
  4. mPaint.setStyle(Paint.Style.STROKE);//描边
  1. //线帽
  2. mPaint.setStrokeCap(Paint.Cap.BUTT);//没有
  3. mPaint.setStrokeCap(Paint.Cap.ROUND);//圆的
  4. mPaint.setStrokeCap(Paint.Cap.SQUARE);//方形
  1. mPaint.setStrokeJoin(Paint.Join.MITER);//锐角
  2. mPaint.setStrokeJoin(Paint.Join.ROUND);//圆弧
  3. mPaint.setStrokeJoin(Paint.Join.BEVEL);//直线

别的API都好理解,这里就不介绍了。
onTouchEvent事件分发
主要使用了Path
Path封装了由直线和曲线(二次,三次贝塞尔曲线)构成的几何路径。你能用Canvas中的drawPath来把这条路径画出来(同样支持Paint的不同绘制模式),也可以用于剪裁画布和根据路径绘制文字。我们有时会用Path来描述一个图像的轮廓,所以也会称为轮廓线(轮廓线仅是Path的一种使用方法,两者并不等价)。
Path详解 如果不了解可以看下这篇文章
moveTo 移动下一次操作的起点位置
lineTo 添加上一个点到当前点之间的直线到Path
主要用到了这两个api
最后就是onDraw().

  • XML直接引用自定义view即可。
    当然,实现这个功能可能还有其它写法,这里只是提供一种思路,也是最简单的实现。

欢迎关注公众号 拖鞋王子猪 一起开心起来。

原文链接:http://www.cnblogs.com/wangzizhu/p/14138992.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号