主要思想:

将一个view设计成多层:背景层,含中奖信息等;

遮盖层,用于刮奖,使用关联一个Bitmap的Canvas

在该Bitmap上,使用它的canvas.drawPath的api来处理 手势滑动(类似刮奖的动作)

使用paint.setXfermode 来进行消除手势滑动区域

public class GuaView extends View {

private Bitmap mBitmap; //遮盖的图层

private Canvas mCanvas; //绘制遮盖图层

private Paint mOuterPaint;

private Path mPath;

private float mLastX;

private float mLastY;

private Bitmap mCoverBitmap; //遮盖图

private int mWidth,mHeight;

private Paint mInnerPaint;

private String mInfo;

public GuaView(Context context) {

this(context,null);

}

public GuaView(Context context,AttributeSet attrs) {

super(context,attrs);

init();

}

private void init() {

mPath = new Path();

mOuterPaint = new Paint();

mInnerPaint = new Paint();

mCoverBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.fg_guaguaka);

mInfo = "¥ 5 0 0";

}

@Override

protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec,heightMeasureSpec);

mWidth = mCoverBitmap.getWidth();

mHeight = mCoverBitmap.getHeight();

setMeasuredDimension(mWidth,mHeight);

mBitmap = Bitmap.createBitmap(mWidth,mHeight,Bitmap.Config.ARGB_8888);

mCanvas = new Canvas(mBitmap);

mCanvas.drawBitmap(mCoverBitmap,null);

setOuterPaint();

setInnerPaint();

}

private void setInnerPaint() {

mInnerPaint.setColor(Color.RED);

mInnerPaint.setStyle(Paint.Style.STROKE);

mInnerPaint.setStrokeCap(Paint.Cap.ROUND);

mInnerPaint.setStrokeJoin(Paint.Join.ROUND);

mInnerPaint.setAntiAlias(true);

mInnerPaint.setDither(true); //防抖

mInnerPaint.setStrokeWidth(5);

mInnerPaint.setTextSize(100);

mInnerPaint.setTextAlign(Paint.Align.CENTER);

}

private void setOuterPaint() {

mOuterPaint.setColor(Color.GREEN);

mOuterPaint.setStyle(Paint.Style.STROKE);

mOuterPaint.setStrokeCap(Paint.Cap.ROUND);

mOuterPaint.setStrokeJoin(Paint.Join.ROUND);

mOuterPaint.setAntiAlias(true);

mOuterPaint.setDither(true); //防抖

mOuterPaint.setStrokeWidth(20);

}

@Override //Path

public boolean onTouchEvent(MotionEvent event) {

float x = event.getX();

float y = event.getY();

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

mLastX = x;

mLastY = y;

mPath.moveTo(x,y);

break;

case MotionEvent.ACTION_MOVE:

float deltaX = Math.abs(x - mLastX);

float deltaY = Math.abs(y - mLastY);

if (deltaX > 5 || deltaY > 5) {

mPath.lineTo(x,y);

}

mLastX = x;

mLastY = y;

break;

case MotionEvent.ACTION_UP:

break;

}

invalidate();//调用onDraw

return true;

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.drawColor(Color.parseColor("#bbbbbb")); //背景底色 灰色

canvas.drawText(mInfo,mWidth / 2,mHeight / 4 * 3,mInnerPaint); //绘制文本

canvas.drawBitmap(mBitmap,null); //绘制mBitmap 这是一个可变的bitmap,通过mCanvas绘制,首先绘制了mCoverBitmap

drawPath();

}

private void drawPath() {

//使用该mode:dst和src相交后, 只保留dst,且除去相交的部份

mOuterPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

mCanvas.drawPath(mPath,mOuterPaint);

}

}

Paint.Join 连续画笔衔接时:

MITER 在外边缘以一个锐角连接

ROUND 以圆弧

BEVEL 以直线

Paint.Cap 指定对于 线和路径(lines and paths) 的开始和结束点的处理方式:

BUTT  ends with the path  不超越它

ROUND  with the center at the end of the path 半圆

SQUARE  with the center at the end of the path 方形

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

android抽奖动画,Android App中实现简单的刮刮卡抽奖效果的实例详解相关推荐

  1. java ant解压缩_java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 发布于 2020-4-7| 复制链接 摘记: java ant包中的org.apache.tools.zip实现 ...

  2. jtable如何从表格中定位_Java Swing组件编程之JTable表格用法实例详解

    本文实例讲述了Java Swing组件编程之JTable表格用法.分享给大家供大家参考,具体如下: 表格是GUI编程中使用较多,但也是最麻烦的一个控件之一.表格是用来显示二维数据,提供编辑,选择等功能 ...

  3. 简单python画圣诞树图片-python圣诞树编写实例详解

    python圣诞树代码 1.简单的绘制圣诞树 新建tree1.py或者直接输入下面代码运行 #声明树的高度 height = 5 #树的雪花数,初始为1 stars = 1 #以数的高度作为循环次数 ...

  4. stm32中spi可以随便接吗_stm32之SPI通信协议实例详解

    之前一直对SPI通信一知半解,所以想抽空把它搞得明白一些.考虑到之前是结合Flash芯片来学的,十分不直观,而且主要把时间和精力都花在Flash芯片的datasheet和驱动上了,SPI通信也没学好. ...

  5. html网页中圆角边框的编写,Html实现边框圆角的实例详解

    这篇文章主要为大家详细介绍了html轻松实现圆角矩形的方法,告诉大家如何通过p+css以及定位来实现圆角矩形?感兴趣的小伙伴们可以参考一下 问题:如何通过p+css以及定位来实现圆角矩形? 解决方法概 ...

  6. android点击另一个app,Android 怎么从一个APP中打开另外一个APP

    Android 如何从一个APP中打开另外一个APP 众所周知,在一个APP内部,从一个页面跳转到另外一个页面是使用startactivity函数来实现的. 同样的,对于应用之间的跳转也是如此的.应用 ...

  7. android 清理缓存动画,Android仿微信清理内存图表动画(解决surfaceView屏幕闪烁问题)demo实例详解...

    最近接了一个项目其中有功能要实现一个清理内存,要求和微信的效果一样.于是想到用surfaceView而不是继承view.下面小编给大家解析下实现思路. surfaceView是为了解决频繁绘制动画产生 ...

  8. Android百度地图实例详解之仿摩拜单车APP(包括附近车辆、规划路径、行驶距离、行驶轨迹记录,导航等)

    Android百度地图实例详解之仿摩拜单车APP(包括附近车辆.规划路径.行驶距离.行驶轨迹记录,导航等) 标签: android百度地图行驶轨迹记录共享单车行驶距离和时间 2017-03-08 20 ...

  9. android mvp模式例子_Android中mvp模式使用实例详解

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...

最新文章

  1. Fastcgi是什么
  2. 曲线学习PyQt5方案一
  3. 《Humans vs Computers》作者访谈录
  4. nvcc fatal : Unsupported gpu architecture 'compute_11'
  5. Jerry的ABAP原创技术文章合集
  6. 【BZOJ2744】【codevs2366】朋友圈,二分图最大匹配
  7. NVIDIA专家全面解析Merlin,GPU加速的推荐系统解决方案速速查收
  8. asa802.k8-telnet for lan-base
  9. python下载百度文库文档
  10. PySide2 QCheckBox控件应用
  11. PSV最实用游戏使用攻略
  12. vue 路由守卫的使用
  13. 中央电视台最常用的 100 首经典背景乐曲(视频制作音乐推荐) 2009-05-12 17:31:47
  14. 计算不规则四边形(多边形)的面积
  15. 野生葫芦娃用心写的nodejs 内置模块------文件操作
  16. 挖掘:如何用迅雷下载4399小游戏站内的所有游戏
  17. MySQL 获取所有库名、表名、字段名
  18. 使用NFC tool工具将加密门禁卡写入小米手环步骤详解
  19. PHP错误和异常处理
  20. 刷穿codeforces计划之词汇积累——Day1

热门文章

  1. Apache不记录制定文件类型日志
  2. 偷窃转基因玉米种子引发中美打农业官司
  3. IOS静态库生成及测试
  4. OOAD实践之路——真实案例解析OO理论与实践(二、第一项任务:特性列表)
  5. paddlepaddle-VisualDL2.0对项目进行可视化调参
  6. Linux根文件系统结构再认识
  7. 【机器学习】——《机器学习实战》面试复习
  8. matlab常用函数——矩阵函数
  9. 学习笔记02:直播串讲——3/22
  10. [WinError 10061] 由于目标计算机积极拒绝,无法连接错误解决办法