android抽奖动画,Android App中实现简单的刮刮卡抽奖效果的实例详解
主要思想:
将一个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中实现简单的刮刮卡抽奖效果的实例详解相关推荐
- java ant解压缩_java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解
java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 发布于 2020-4-7| 复制链接 摘记: java ant包中的org.apache.tools.zip实现 ...
- jtable如何从表格中定位_Java Swing组件编程之JTable表格用法实例详解
本文实例讲述了Java Swing组件编程之JTable表格用法.分享给大家供大家参考,具体如下: 表格是GUI编程中使用较多,但也是最麻烦的一个控件之一.表格是用来显示二维数据,提供编辑,选择等功能 ...
- 简单python画圣诞树图片-python圣诞树编写实例详解
python圣诞树代码 1.简单的绘制圣诞树 新建tree1.py或者直接输入下面代码运行 #声明树的高度 height = 5 #树的雪花数,初始为1 stars = 1 #以数的高度作为循环次数 ...
- stm32中spi可以随便接吗_stm32之SPI通信协议实例详解
之前一直对SPI通信一知半解,所以想抽空把它搞得明白一些.考虑到之前是结合Flash芯片来学的,十分不直观,而且主要把时间和精力都花在Flash芯片的datasheet和驱动上了,SPI通信也没学好. ...
- html网页中圆角边框的编写,Html实现边框圆角的实例详解
这篇文章主要为大家详细介绍了html轻松实现圆角矩形的方法,告诉大家如何通过p+css以及定位来实现圆角矩形?感兴趣的小伙伴们可以参考一下 问题:如何通过p+css以及定位来实现圆角矩形? 解决方法概 ...
- android点击另一个app,Android 怎么从一个APP中打开另外一个APP
Android 如何从一个APP中打开另外一个APP 众所周知,在一个APP内部,从一个页面跳转到另外一个页面是使用startactivity函数来实现的. 同样的,对于应用之间的跳转也是如此的.应用 ...
- android 清理缓存动画,Android仿微信清理内存图表动画(解决surfaceView屏幕闪烁问题)demo实例详解...
最近接了一个项目其中有功能要实现一个清理内存,要求和微信的效果一样.于是想到用surfaceView而不是继承view.下面小编给大家解析下实现思路. surfaceView是为了解决频繁绘制动画产生 ...
- Android百度地图实例详解之仿摩拜单车APP(包括附近车辆、规划路径、行驶距离、行驶轨迹记录,导航等)
Android百度地图实例详解之仿摩拜单车APP(包括附近车辆.规划路径.行驶距离.行驶轨迹记录,导航等) 标签: android百度地图行驶轨迹记录共享单车行驶距离和时间 2017-03-08 20 ...
- android mvp模式例子_Android中mvp模式使用实例详解
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...
最新文章
- Fastcgi是什么
- 曲线学习PyQt5方案一
- 《Humans vs Computers》作者访谈录
- nvcc fatal : Unsupported gpu architecture 'compute_11'
- Jerry的ABAP原创技术文章合集
- 【BZOJ2744】【codevs2366】朋友圈,二分图最大匹配
- NVIDIA专家全面解析Merlin,GPU加速的推荐系统解决方案速速查收
- asa802.k8-telnet for lan-base
- python下载百度文库文档
- PySide2 QCheckBox控件应用
- PSV最实用游戏使用攻略
- vue 路由守卫的使用
- 中央电视台最常用的 100 首经典背景乐曲(视频制作音乐推荐) 2009-05-12 17:31:47
- 计算不规则四边形(多边形)的面积
- 野生葫芦娃用心写的nodejs 内置模块------文件操作
- 挖掘:如何用迅雷下载4399小游戏站内的所有游戏
- MySQL 获取所有库名、表名、字段名
- 使用NFC tool工具将加密门禁卡写入小米手环步骤详解
- PHP错误和异常处理
- 刷穿codeforces计划之词汇积累——Day1