突发奇想,Android实现类似于刮彩票的效果,于是完成了一个小例子,其中有不完善的地方,比如判断彩票是否中奖是以是否刮彩票3次判断的,而不是以面积来计算的。

核心部分是借鉴网上代码的,不过找不到源地址了。

实现了基本的刮奖效果,并且进行了一定的封装,拷贝其中的类即可使用。

具体下载目录在 /2014年资料/5月/26日/Android实现刮奖的效果

示例图:

代码如下:

ErnieActivity类:

public class ErnieActivity extends Activity{

Button erniebtn;

RelativeLayout container;

ErinieShow erinieShow;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

erniebtn=(Button) findViewById(R.id.erniebtn);

container=(RelativeLayout) findViewById(R.id.container);

erniebtn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

showErnie();

}

});

}

private void showErnie(){

//  container

container.removeAllViews();

int level = getLevel();

erinieShow=new ErinieShow(this, level);

container.addView(erinieShow,new LayoutParams(-2,-2));

}

/**

* 获取奖励等级

* @return

*/

public int getLevel(){

//随机,看看几等奖

double d=Math.random()*100;

if(d<50){

return 0;

}

if(d<80){

return 3;

}

if(d<95){

return 2;

}

return 1;

}

@Override

protected void onDestroy() {

super.onDestroy();

}

}

ErinieShow类:

public class ErinieShow extends RelativeLayout {

Context context;

RelativeLayout rubblerBG;

RubblerShow rubblerShow;

Button getReward;

int rubblerBGId = 10001;

int getRewardId = 10002;

int level;

public ErinieShow(Context context, int level) {

super(context);

this.context = context;

this.level = level;

getElement();

setElementLP();

setElementStyle();

setElement();

}

private void getElement() {

rubblerBG = new RelativeLayout(context);

rubblerShow = new RubblerShow(context,handler);

getReward = new Button(context);

rubblerBG.setId(rubblerBGId);

getReward.setId(getRewardId);

rubblerBG.addView(rubblerShow);

addView(rubblerBG);

addView(getReward);

}

private void setElementLP() {

int[] resolution = PhoneUtil.getResolution(context);

RelativeLayout.LayoutParams rubblerBG_LP = new RelativeLayout.LayoutParams(

resolution[0], PhoneUtil.getFitHeight(context, 125));

rubblerBG.setLayoutParams(rubblerBG_LP);

rubblerShow.setLayoutParams(rubblerBG_LP);

RelativeLayout.LayoutParams getReward_LP = new LayoutParams(-2, -2);

getReward_LP.addRule(RelativeLayout.CENTER_HORIZONTAL);

getReward_LP.addRule(RelativeLayout.BELOW,rubblerBGId);

getReward.setLayoutParams(getReward_LP);

}

private void setElementStyle() {

switch (level) {

case 0:

rubblerBG.setBackgroundResource(R.drawable.rewardlevel0);

break;

case 1:

rubblerBG.setBackgroundResource(R.drawable.rewardlevel1);

break;

case 2:

rubblerBG.setBackgroundResource(R.drawable.rewardlevel2);

break;

default:

rubblerBG.setBackgroundResource(R.drawable.rewardlevel3);

break;

}

//  getReward.setBackgroundResource(R.drawable.get_award);

}

private void setElement() {

rubblerShow.beginRubbler(Color.parseColor("#d3d3d3"), 30, 10);

getReward.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if(level==0){

Toast.makeText(context, "很遗憾,此次未中奖,再接再厉吧!", Toast.LENGTH_SHORT).show();

}else{

Toast.makeText(context, "恭喜您,获得了"+level+"等奖。", Toast.LENGTH_SHORT).show();

}

}

});

//先设置为不可点击

getReward.setClickable(false);

getReward.setText("领奖");

}

Handler handler=new Handler(){

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

if(msg.what==200){

getReward.setClickable(true);

}else{

}

}

};

}

RubblerShow类:

public class RubblerShow extends TextView {

private float TOUCH_TOLERANCE; // 填充距离,使线条更自然,柔和,值越小,越柔和。

// private final int bgColor;

private Bitmap mBitmap;

private Canvas mCanvas;

private Paint mPaint;

private Path mPath;

private float mX, mY;

private boolean isDraw = false;

Handler handler;

int time=0;

public RubblerShow(Context context, Handler handler) {

super(context);

this.handler=handler;

// bgColor =

// attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android",

// "textColor", 0xFFFFFF);

// System.out.println(bgColor);

// System.out.println(attrs.getAttributeValue("http://schemas.android.com/apk/res/android",

// "layout_width"));

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

if (isDraw) {

mCanvas.drawPath(mPath, mPaint);

// mCanvas.drawPoint(mX, mY, mPaint);

canvas.drawBitmap(mBitmap, 0, 0, null);

}

}

/**

* 开启檫除功能

*

* @param bgColor

*            覆盖的背景颜色

* @param paintStrokeWidth

*            触点(橡皮)宽度

* @param touchTolerance

*            填充距离,值越小,越柔和。

*/

public void beginRubbler(final int bgColor, final int paintStrokeWidth,

float touchTolerance) {

TOUCH_TOLERANCE = touchTolerance;

// 设置画笔

mPaint = new Paint();

// mPaint.setAlpha(0);

// 画笔划过的痕迹就变成透明色了

mPaint.setColor(Color.BLACK); // 此处不能为透明色

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

// 或者

// mPaint.setAlpha(0);

// mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

mPaint.setAntiAlias(true);

mPaint.setDither(true);

mPaint.setStyle(Paint.Style.STROKE);

mPaint.setStrokeJoin(Paint.Join.ROUND); // 前圆角

mPaint.setStrokeCap(Paint.Cap.ROUND); // 后圆角

mPaint.setStrokeWidth(paintStrokeWidth); // 笔宽

// 痕迹

mPath = new Path();

// 覆盖

LayoutParams layoutParams = getLayoutParams();

int height = layoutParams.height;

int width;

if (getLayoutParams().width == LayoutParams.MATCH_PARENT) {

width = 700;

} else {

width = layoutParams.width;

}

mBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);

mCanvas = new Canvas(mBitmap);

mCanvas.drawColor(bgColor);

isDraw = true;

}

@Override

public boolean onTouchEvent(MotionEvent event) {

if (!isDraw) {

return true;

}

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN: // 触点按下

// touchDown(event.getRawX(),event.getRawY());

touchDown(event.getX(), event.getY());

invalidate();

break;

case MotionEvent.ACTION_MOVE: // 触点移动

touchMove(event.getX(), event.getY());

invalidate();

if(time++>3&&handler!=null){

handler.sendEmptyMessage(200);

}

break;

case MotionEvent.ACTION_UP: // 触点弹起

touchUp(event.getX(), event.getY());

invalidate();

break;

default:

break;

}

return true;

}

private void touchDown(float x, float y) {

mPath.reset();

mPath.moveTo(x, y);

mX = x;

mY = y;

}

private void touchMove(float x, float y) {

float dx = Math.abs(x - mX);

float dy = Math.abs(y - mY);

if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {

mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);

mX = x;

mY = y;

}

}

private void touchUp(float x, float y) {

mPath.lineTo(x, y);

mCanvas.drawPath(mPath, mPaint);

mPath.reset();

}

}

android motion linux handle,Android实现刮奖的效果相关推荐

  1. Android获取Linux图像信息,Android系统信息获取 之十三:Linux内核版本信息获取

    Android系统信息获取 之十三:Linux内核版本信息获取 Android系统是基于Linux的,各个Android版本对应的Linux版本不尽相同,我们这里不去追究各个Android对应的Lin ...

  2. android升级linux 内核,Android要升级Linux 3.10内核了!

    Android系统版本连续提升,而作为其本源的Linux内核也在跟着更新,只不过一般会有4-8个月的延后,比如安卓4.3就还是Linux 3.4内核代码库. 不过很快,安卓就要使用最新的Linux 3 ...

  3. android studio linux 字体,Android Studio代码字体模糊解决方法

    HDU3394:Railway 传送门 点双练习. 对于一张图,询问有多少条边不属于任意一个点双和多少条边至少属于两个点双. 显然,一张图里有多少个桥就是第一问的答案. 对于第二问,考虑对于一个点双, ...

  4. android service使用handle,android中对Looper、HandlerThread、IntentService的理解及使用方法...

    消息队列处理模型 容器保存事件,队列 涉及到角色: 类 功能 MessageQueue 存放消息 Looper 轮循消息队列,从中取出消息 Thread 处理消息 Message 消息 Handler ...

  5. android textview抽屉滑动,Android SlidingDrawer 滑动抽屉效果

    效果如上图,想必大家已经在很多应用中看到过了,下面来看看用SlidingDrawer 实现滑动抽屉效果 从Android1.5开始,加入了android.widget.SlidingDrawer类 S ...

  6. 刮刮奖效果的简单实现

    刮刮奖效果的简单实现 无意中看到个刮刮奖的效果,觉得很有意思.就想自己也做一个,怎样用html5及javascript实现呢,回忆以前 做报表的时候,用过html5 canvas元素.心里就有思路了. ...

  7. JavaScript刮奖效果(jquery图片刮奖插件)

    原文出处: http://www.codefans.net/jscss/code/4593.shtml jquery.scratchie.js图片刮奖插件实例演示代码,可实现类似刮奖的效果,刮刮乐中的 ...

  8. html5刮奖效果,HTML5 Canvas实战之刮奖效果

    近年来由于移动设备对HTML5的较好支持,经常有活动用刮奖的效果,最近也在看H5方面的内容,就自己实现了一个,现分享出来跟大家交流. 1.效果 2.原理 原理很简单,就是在刮奖区添加两个canvas, ...

  9. android 实现刮刮乐刮奖效果

    在做电商类产品时,经常会有一些活动需求,如抽奖,抽奖的一种方式就是刮刮乐,这次的内容是利用重写View的方式实现刮刮乐的效果. 思路:利用Bitmap做刮奖区的蒙版,利用paint将手指触摸过的区域置 ...

最新文章

  1. 《iOS 8应用开发入门经典(第6版)》——第1章,第1.6节小结
  2. WCF布署问题 :HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。...
  3. 43.StrVec类:std::move调用移动构造函数的一个实例
  4. 请求服务器 显示非法访问,访问负载均衡出现访问host非法
  5. unity打开一片黑_麦吉丽素颜三部曲俗话说的好,一黑毁所有! 天生黑皮肤,该怎么办!...
  6. 『中级篇』Docker Cloud自动构建 Docker image(55)
  7. spock测试_用于混合Spock 1.x和JUnit 5测试的Maven项目设置
  8. 输出四位完全平方数_完全平方数中的规律
  9. HTML荧光文字动态效果,html – 在CSS中的笔荧光笔效果
  10. canvas需要gpu_【前端冷知识】你了解Canvas的渲染上下文吗?
  11. Mysql_mysql force Index 强制索引
  12. 框架学习之Spring 前言
  13. 硬盘分区后的逻辑结构
  14. C++ OS 网络 数据库 (面试)
  15. mysql覆盖索引理解
  16. Tensorflow入门笔记——tf.app.flags.FLAGS用法介绍
  17. 【Python讲义】WEEK 8
  18. 刚开始做微商如何引流 ?一开始做微商没有客源怎么办
  19. python web.py服务器与客户端
  20. 深度学习笔记其五:卷积神经网络和PYTORCH

热门文章

  1. POJ 1379 Run Away 模拟退火
  2. 在Flex4中使用RemoteObjectAMF0来连接fluorine网关 转
  3. 字符编码与文件的基本操作
  4. 关于java cxf的webservice,(restfurl可以)可用asix和cxf接收
  5. 四川安湖科技:抖音开店有什么流程
  6. 方向键不能控制选择单元格
  7. 使用axios发送请求(不带参数和带参数)和使用mockjs
  8. vs中的sln和suo文件是什么
  9. 立体捕捉系统市场现状研究分析报告
  10. echarts图例样式修改