说明:该代码是参考鸿洋大神的刮刮乐自定义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. Mol Cell Proteomics. | MARMoSET – Extracting Publication-ready Mass Spectrometry Metadata from RAW Files

    本文是马克思普朗克心肺研究所的三名研究者Marina Kiweler.Mario Looso和Johannes Graumann发表在8月刊的MCP的一篇文章. 由于Omics实验经常涉及数百个数据文 ...

  2. adt-bundle环境搭建(Win7+Win10)

    一.adt-bundle安装包 安装包的下载地址:http://tools.android-studio.org/index.php/adt-bundle-plugin  链接中包含有windows. ...

  3. golang工具之present - 编写go特色的ppt

    简介: Golang Present 是 Golang 社群开发出來的一个简单工具,通过简单的语法可以制作 ppt(语法近似于 Markdown).   默认文件格式是 .slide ,是随着 gol ...

  4. 详解十大经典机器学习算法——EM算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第14篇文章,我们来聊聊大名鼎鼎的EM算法. EM算法的英文全称是Expectation-maximization al ...

  5. 深度强化学习(DRL)专栏(一)

    目录: 1. 引言 专栏知识结构 从AlphaGo看深度强化学习 2. 强化学习基础知识 强化学习问题 马尔科夫决策过程 最优价值函数和贝尔曼方程 3. 有模型的强化学习方法 价值迭代 策略迭代 4. ...

  6. List<Object>转List<T>

    今天遇到一个麻烦,公司有个项目用了一个封装dao的模板,他妈的不管是查一条数据的方法,还是查一个集合数据的方法,全都返回Object或List<Object> 由于对象是Object根本不 ...

  7. .Net Core2.2 使用 AutoMapper进行实体转换

    一.遇到的问题 在. Core Api 的编写中,我们经常会对一些功能点进行新增编辑操作,同时我们有时也会进行查询,但是我们查询的表的数据与我们返回的数据相差甚大,这是我们有需要自己手动进行类型的转换 ...

  8. coding++:thymelef 模板报错 the entity name must immediately follow the '&' in the entity reference

    thymelef模板里面是不能实用&符号的 要用&转义符代替,官网也有文档说明可以用官方的通配符代替, 官方文档 http://www.thymeleaf.org/doc/tutori ...

  9. Redis 集群--------Redis-cluster

    1集群方案 1.官方方案redis-cluster搭建实战 2.客户端分片技术(不推荐),扩容/缩容时,必须手动调整分片程序,出现故障不能自动转移 3.可以使用主从复制方式(不推荐) 4.使用一些代理 ...

  10. Java多线程问题40个

    1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓”知其然知其所以然”,”会用”只是”知其然”,”为什么用”才是”知其所以然 ...