说明:该代码是参考鸿洋大神的刮刮乐自定义view来写的。

实现:刮刮乐-刮奖的效果,如下效果

下面直接放代码了:只有一个自定义view,要实现真正的功能还需要进一步封装

 /**
* 自定义view-刮刮乐
*/
public class GuaGuaKaView extends View{ /**
* 记录用户绘制的Path
*/
private Path mPath = new Path(); /**
* mCanvas绘制内容在其上
*/
private Bitmap mBitmap; /**
* 内存中创建的Canvas
*/
private Canvas mCanvas; /**
* 绘制线条的Paint,即用户手指绘制Path
*/
private Paint mOutterPaint = new Paint();
private int mLastX;
private int mLastY;
private boolean isComplete=false; private int[] mPixels;
private Paint mBackPint = new Paint();
private Rect mTextBound = new Rect();
private String mText = "50,000 元"; public GuaGuaKaView(Context context)
{
this(context, null);
} public GuaGuaKaView(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
} public GuaGuaKaView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
} private void init()
{
mPath = new Path();
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width=getMeasuredWidth();
int height=getMeasuredHeight();
mBitmap=Bitmap.createBitmap(width, height, Config.ARGB_8888);
mCanvas=new Canvas(mBitmap);
setUpBackPaint();
setUpOutPaint();
mCanvas.drawColor(Color.parseColor("#c0c0c0"));
Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.s_title);
mCanvas.drawBitmap(bitmap, null,new RectF(0, 0, width, height), null);
} private void setUpOutPaint() {
//设置画笔
mOutterPaint.setColor(Color.RED);
mOutterPaint.setDither(true);//?
mOutterPaint.setAntiAlias(true);//设置是否有锯齿
mOutterPaint.setStyle(Paint.Style.STROKE);
mOutterPaint.setStrokeJoin(Paint.Join.ROUND);//?
mOutterPaint.setStrokeCap(Paint.Cap.ROUND);//? //设置画笔宽度
mOutterPaint.setStrokeWidth(50);
} /**
* 初始化canvas的绘制用的画笔
*/
private void setUpBackPaint()
{
mBackPint.setStyle(Style.FILL);
mBackPint.setTextScaleX(2f);
mBackPint.setColor(Color.DKGRAY);
mBackPint.setTextSize(50);
mBackPint.getTextBounds(mText, 0, mText.length(), mTextBound);
} @Override
protected void onDraw(Canvas canvas) {
drawBackText(canvas);
if(!isComplete){
drawPath();
canvas.drawBitmap(mBitmap, 0, 0,null);
}
} private void drawBackText(Canvas canvas) {
//绘制奖项
canvas.drawText(mText, getWidth() / 2 - mTextBound.width() / 2,
getHeight() / 2 + mTextBound.height() / 2, mBackPint);
} /**
* 绘制线头
*/
private void drawPath() {
mOutterPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
mCanvas.drawPath(mPath, mOutterPaint);
} @Override
public boolean onTouchEvent(MotionEvent event) {
int action=event.getAction();
int x=(int) event.getX();
int y=(int) event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
mLastX=x;
mLastY=y;
mPath.moveTo(mLastX, mLastY);
break;
case MotionEvent.ACTION_MOVE:
int dx=Math.abs(x-mLastX);
int dy=Math.abs(y-mLastY);
if(dx>3||dy>3){
mPath.lineTo(x, y);
}
mLastX=x;
mLastY=y;
break;
case MotionEvent.ACTION_UP:
new Thread(mRunnable).start();
break;
default:
break;
}
invalidate();
return true;
} /*
* 统计擦除区域的面积
*/
private Runnable mRunnable=new Runnable() { @Override
public void run() {
int w=getWidth();
int h=getHeight();
float wipeArea=0;
float totalArea=w*h;//总面积
Bitmap bitmap=mBitmap;
mPixels=new int[w*h];
//拿到所有的像素信息 ?
bitmap.getPixels(mPixels, 0, w, 0, 0, w, h); //遍历统计擦除的区域
for(int i=0;i<w;i++){
for(int j=0;j<h;j++){
int index=i+j*w;
if(mPixels[index]==0){//擦除后,该点像素值为0
wipeArea++;
}
}
} if(wipeArea>0&&totalArea>0){
int percent=(int)(wipeArea*100/totalArea);
Log.e("TAG", percent+"");
if(percent>70){
isComplete=true;
postInvalidate();
}
}
}
}; }

至此,完了。

刮刮乐自定义view的更多相关文章

  1. Android 自定义View修炼-【2014年最后的分享啦】Android实现自定义刮刮卡效果View

    一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文& ...

  2. 【Android - 自定义View】之自定义View实现“刮刮卡”效果

    首先来介绍一下这个自定义View: (1)这个自定义View的名字叫做 GuaguakaView ,继承自View类: (2)这个View实现了很多电商项目中的“刮刮卡”的效果,即用户可以刮开覆盖层, ...

  3. 【Android界面实现】使用Canvas对象实现“刮刮乐”效果

    在淘宝.京东等电商举办活动的时候,常常能够看到在移动client推出的各种刮奖活动,而这样的活动也受到了非常多人的喜爱.从client的体验来说,这样的效果应该是通过网页来实现的,那么,我们使用And ...

  4. Android打造完美的刮刮乐效果控件

    技术:Android+Java   概述 趁着元旦假期之际,首先在这里,我祝福大家在新的2019年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆 ...

  5. iOS-仿支付宝刮刮乐效果

    概述 仿支付宝刮刮乐效果, 可以按照自己需求更改展示刮出来的效果的view(即刮开后刮刮乐效果展示) 详细 代码下载:http://www.demodashi.com/demo/10673.html ...

  6. 赵雅智_Android案例_刮刮乐

    实现效果 主要代码 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  7. Android 撕衣服(刮刮乐游戏)

    项目简单介绍: 该项目为撕衣服,相似刮刮乐游戏 具体介绍: 用户启动项目后.载入一张图片,当用户点击图片的时候,点击的一片区域就会消失.从而显示出在这张图片以下的图片 这个小游戏相似与刮奖一样,刮开涂 ...

  8. 游戏的套路你知道吗? H5 Canvas刮刮乐

    玩游戏的人 很多时候都会遇到翻牌子  开宝箱. 总有人傻傻的在哪里还纠结很久到底点哪一个! 纠结  指不定翻哪一个会多一点,你明明看到那个卡片的奖项多 . 那我就告诉你好了  其实很多时候在你点开那个 ...

  9. WP8下实现刮刮乐(橡皮擦)功能

    说到刮刮乐这个功能,我们最先想到的是上下两张(长方形)重叠,之后对上面这张图片进行操作. 我的想法是:通过手势,让手指划过的地方变成透明的,底部就会显示了. 那如何让图片变为透明呢?这就要对图片的像素 ...

随机推荐

  1. SpringMVC框架——转发与重定向

    网上摘取一段大神总结的转发与重定向的区别,如下: 转发(服务端行为) 形式:request.getRequestDispatcher().forward(request,response) 转发在服务 ...

  2. 推荐几个来自 MOOCs的 Data Science

    数据科学是一个大领域,如果你想成为一个优秀的数据专家,自学是必要的技能. MOOCs是数据科学的主要来源.有许多网站提供了 MOOCs,比如Coursera.Coursera和Udacity都还不错. ...

  3. Linux你不知道的ping操作

    1.指定ping的次数  -c 选项 ping -c 3 www.baidu.com 2.只返回结果  -q  选项 ping -q -c 3 www.baidu.com 3.指定数据包的大小  -s ...

  4. rest_framework序列化,反序列化

    序列化组件 from rest_framework.response import Response1.Response本质也是继承了httpresponse,比httpResponse还强大,传入一 ...

  5. demo08-js条件运算符

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. [简单路径] Useful Decomposition

    Ramesses knows a lot about problems involving trees (undirected connected graphs without cycles)! He ...

  7. Unity 随机房间地图生成

    无论是在迷宫还是类似于地牢的游戏地图中,利用程序来生成每次都不一样的地图是一件叫人兴奋不已的事. 这时我们需要解决两个非常重要的随机事件: 1.在一定范围内随机出各不相同但又不能互相重叠的房间 2.优 ...

  8. 七大Github机器学习热门项目

    译者 | 小韩 来源 | analyticsvidhya.com[磐创AI导读]:让我们一起来看下近期热门的机器学习Github仓库,包括了自然语言处理(NLP).计算机视觉(CV)与大数据等多个领域 ...

  9. 一份从入门到精通NLP的完整指南 | NLPer

    该小博主介绍 本人:笔名zenRRan,方向自然语言处理,方法主要是深度学习. 未来的目标:人工智能之自然语言处理博士. 写公众号目的:将知识变成开源,让每个渴求知识而难以入门人工智能的小白以及想进阶 ...

  10. 一夜搞懂 | JVM 类加载机制

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图 一.为什么要学习类加载机制? 今天想跟大家唠嗑唠嗑Java的类加载机制,这是Java的一个很重要的创 ...