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

主要思想:

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

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

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

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

15059139271.jpg?2016231173633

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

忙了一上午终于把形状特征搞定了啊

就是光滑度和紧致度,这个实现起来还是比较简单的,不过不知道这两个特征作用到底有多大啊!

如何提高英语听力(内容摘自NECCS)+ 乘法表

乘法表 print(\n.join([ .join([%s*%s%-2s%(y,x,x*y) for y in range(1,x1)]) for x in range(1,10)])) 如何提高英语听力 很喜欢这篇关于提高英语听力的文章,所以收藏下来和大家一同分享一下 人走路时要用两条腿,没有任何人会觉得走路费劲。可如果让人…

android新拟态实现方法,Android 新拟态UI (Neumorphism)

前言本文转自github,只是进行了图片的处理和部分翻译,已获作者授权截至首次发文前找到的原作者的文章地址-May,17,2020若找到本文章更新的时间节点,请私信我更新。原作者github地址文末附源码下载地址,免费。Android上的拟态化UIT…

codeforces 919E Congruence Equation

E. Congruence Equationtime limit per test3 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputGiven an integer x. Your task is to find out how many positive integers n (1 ≤ n ≤ x) satisfy where a, b, p are all known co…

抽象工厂模块在开发中的应用

抽象工厂是设计模块中创建型模式的一种,它比起工厂方法模式来说,更加具有一般性,在本模式中会引入一个产品族的概念,就是说,在本模式中抽象产品会有多个,然后用抽象工厂去调用它们,具体怎么去调用由具体工厂…

android 过滤数组中的重复元素,Flutter List数组避免插入重复数据的实现

List具有一定长度存在索引的对象集合(长度为0不存在索引,长度>0存在索引)常见列表1、定长列表默认值null例如:List fixedLengthList new List(2)、List fixedLengthList new List(8)List fixedLengthList new List(2);for(int i0;i<2;i){print("索引为${i}的值${…

[js]jquery里的jsonp实现ajax异源请求

同源请求-jquery <script type"text/javascript" src"http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script><script type"text/javascript">$.ajax({url: "data.txt",type: "get",dataType…

android listview remove 动画,给Android ListView添加删除item动画

给Android ListView添加删除item动画给listview删除一个item的时候加上一个折叠动画&#xff0c;感觉效果会好一点。步骤是当删除一个view&#xff0c;先用动画把view的高度改变&#xff0c;看上去就是折叠的效果。当动画完成的时候&#xff0c;再真正把item移除。private void…

Css 选择器 算法 规则

首先上图 css 命令在读取时是按照其优先级的高低的先后顺序来解读的&#xff0c;当优先级相同时是按照其css命令写的先后顺序来读取的&#xff0c;即后面的css覆盖&#xff08;前后css属性设置 不同时&#xff09;或继承&#xff08;前后css属性设置相同或后面未设置该css属性时…

鸡尾酒排序算法c语言,[golang] 数据结构-鸡尾酒排序

吐个槽又是一个不正经取名的排序算法。真要说和鸡尾酒间的关系&#xff0c;大概就是想喝到鸡尾酒(得到排序好的队列)就要摇晃酒杯让不同的成分混合均匀(向两个方向冒泡排序)原理鸡尾酒排序(Cocktail Sort)是冒泡排序的一种优化算法。原本的冒泡排序只能在一轮中挑出一个值移动到…

ie6 div height bug css注意点(转)

所有浏览器的定位都大同小异&#xff0c;在各个浏览器兼容性问题&#xff0c;要了解各个浏览器的定位区别就可以了。 比如&#xff0c;当用float浮动时&#xff0c;同时设置margin或padding在IE6中会是双倍的值。即你设置为margin:10px;那么在IE6里就相当于margin:20px; 出现这…

Python算法——二叉树

一、二叉树 from collections import dequeclass BiTreeNode:def __init__(self, data):self.data dataself.lchild Noneself.rchild Nonea BiTreeNode(A) b BiTreeNode(B) c BiTreeNode(C) d BiTreeNode(D) e BiTreeNode(E) f BiTreeNode(F) g BiTreeNode(G)e.lchil…

艾伟_转载:.NET 4.0新特性-- Corrupted State Exceptions

作为程序员&#xff0c;我想很多人应该都有过跟异常打交道的经历。而且相信也有很多人也都写过catch(Exception e){//blabla}这种把所有未知异常一股脑儿捕获并处理掉的代码吧。不管是为敷衍客户也好&#xff0c;让程序继续运行以避免糟糕的用户体验也罢&#xff0c;在微软眼中…

android sdk 2.9.5.0,如何找到问题Android SDK 3.0错误:(9,5)错误:资源android:attr/colorError未找到...

当我做一个make时如何找到此错误的问题我收到此错误消息&#xff1a;错误&#xff1a;(9,5)错误&#xff1a;找不到资源android&#xff1a;attr / colorError奇怪的是我有2个build.gradle文件&#xff1a;这里是我的build.gradle(Project&#xff1a;Projectname)文件&#xf…

c# 读取 txt 文件中数据(int)

今天在学图的算法做测试是&#xff0c;需要读取文本文件中的点坐标&#xff0c;本来很简单的事情&#xff0c;折腾了半天&#xff0c;记录一下找到的一种简单粗暴的解决方法&#xff0c;以便以后查看。 第一种方法 &#xff1a; StringReader string line "";using …

艾伟_转载:使用Lambda表达式编写递归函数

前言 著名的牛顿同学曾经说过&#xff1a;如果说我比别人看得更远些,那是因为我站在了巨人的肩上. 原文&#xff1a;If I have been able to see further, it was only because I stood on the shoulders of giants. Whats Lambda表达式? 请参考msdn&#xff1a;Lambda 表达式…

android 模拟器read-only file system,WAC启动Android模拟器 transfer error: Read-only file system错误解决方法...

这两天在用WAC SDK开发Widget时&#xff0c;在启动Android模拟器时Eclipse的Consle出现如下错误&#xff1a;[2011-11-27 22:08:49 - ddms]transfer error: Read-only file system然后Widget无法安装和执行&#xff01;在参考了官方论坛上的相同问题的一个帖子后&#xff0c;也…

spring5.0.2中文官网文档pdf

下载地址&#xff1a;网盘下载Spring是一个开放源代码的设计层面框架&#xff0c;他解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应用。本参考指南提供了有关spring5.0.2的详细信息。它全面的介绍了Spring的所有的功能&#x…

IT销售素质 -- 自信进取

到外企面试过销售职位的人都知道“aggressive ”这个英文词。这个词的意思是“侵略的&#xff0c;爱寻衅的&#xff0c;敢做敢为的&#xff0c;有进取心的”。经理们希望销售们都够“aggressive”&#xff0c;意思就是要他们个个都积极进取&#xff0c;主动进攻。 销售是一…

android判断sd u盘,[Android Framework]获取U盘 SD 状态

Android 4.4 SD 和 U盘 的状态通过获取StorageVolume 类来判断 是sd还是U盘。我们来看一下这个类package android.os.storage;import android.content.Context;import android.os.Parcel;import android.os.Parcelable;import android.os.UserHandle;import com.android.intern…