说明:该代码是参考鸿洋大神的刮刮乐自定义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. VS2019 C++动态链接库的创建使用(2) - 客户调用接口

    因为动态链接库里的内容是自己定义的,所以在外部程序调用时我们自己知道库里包含哪些变量和函数,如果我们提供库给其他人使用,则最好增加一个头文件,告知库里包含的函数: ①将动态链接库源文件内容增加红色框内 ...

  2. kubernetes 1.17.2结合ceph13.2.8 实现jenkins部署并用traefik2.1代理

    注:关于ceph.kubernetes集群的部署在此不声明,相信搜到本篇博文,你一定对ceph.kubernetes的部署环节手刃有余. 注:本篇博文牵扯到的技术点有:ceph.kubernetes. ...

  3. ModelForm理解简单运用(增删改查)

    from django.shortcuts import render, redirect,HttpResponse# Create your views here.from django.forms ...

  4. 解决python3使用cx_Freeze打包成exe后不能运行

    我使用的是python3.4,在使用cx_Freeze打包成exe后发现有些打包后程序能够运行,但是有些无法运行 这是控制台报错 经过多方查找发现原来是windows缺少一些python的扩展包 如下 ...

  5. Transformers 库常见的用例 | 三

    作者|huggingface 编译|VK 来源|Github 本章介绍使用Transformers库时最常见的用例.可用的模型允许许多不同的配置,并且在用例中具有很强的通用性.这里介绍了最简单的方法, ...

  6. 【Pytest02】全网最全最新的Pytest框架快速进阶篇(pytest前置和后置以及忽略测试用例)

    一.Pytest的前置和后置方法 1.Pytest可以集成unittest实现前置和后置 import unittest import pytest class TestCase(unittest.T ...

  7. JVM 常见参数配置

    -XX:+PrintGC  每次触发GC的时候打印相关日志 -XX:+PrintGCDetails 每次触发GC的时候更详细的相关日志 -XX:+UseSerialGC 串行回收 -Xms 堆初始值( ...

  8. 16.如何查找所需的maven的依赖

    http://mvnrepository.com/ 1.先打开上面的网址 搜索需要的依赖,点进去 2.选择需要的版本 3.红框中的就是依赖的地址 此外也有其他自动化构建工具所需要的地址

  9. 2020.4.4号全国疫情哀悼日网页变灰色前端是如何实现的?-pink老师

    今天是4.4疫情哀悼日,纪念疫情期间牺牲的烈士和逝世同胞,因此大部分网站颜色都变灰色了,我们前端是如何实现的呢? 核心原理,使用css3的滤镜效果即可,filter grayscale 将整个界面变为 ...

  10. 《java编程思想》多态与接口

    向上转型 定义:把某个对象的引用视为对其基类类型的引用的做法被称为向上转型方法调用绑定 将一个方法调用同一个方法主体关联起来被称作绑定. 前期绑定:程序执行前进行的绑定叫做前期绑定,前期绑定也是jav ...