刮刮乐自定义view
说明:该代码是参考鸿洋大神的刮刮乐自定义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的更多相关文章
- Android 自定义View修炼-【2014年最后的分享啦】Android实现自定义刮刮卡效果View
一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文& ...
- 【Android - 自定义View】之自定义View实现“刮刮卡”效果
首先来介绍一下这个自定义View: (1)这个自定义View的名字叫做 GuaguakaView ,继承自View类: (2)这个View实现了很多电商项目中的“刮刮卡”的效果,即用户可以刮开覆盖层, ...
- 【Android界面实现】使用Canvas对象实现“刮刮乐”效果
在淘宝.京东等电商举办活动的时候,常常能够看到在移动client推出的各种刮奖活动,而这样的活动也受到了非常多人的喜爱.从client的体验来说,这样的效果应该是通过网页来实现的,那么,我们使用And ...
- Android打造完美的刮刮乐效果控件
技术:Android+Java 概述 趁着元旦假期之际,首先在这里,我祝福大家在新的2019年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆 ...
- iOS-仿支付宝刮刮乐效果
概述 仿支付宝刮刮乐效果, 可以按照自己需求更改展示刮出来的效果的view(即刮开后刮刮乐效果展示) 详细 代码下载:http://www.demodashi.com/demo/10673.html ...
- 赵雅智_Android案例_刮刮乐
实现效果 主要代码 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...
- Android 撕衣服(刮刮乐游戏)
项目简单介绍: 该项目为撕衣服,相似刮刮乐游戏 具体介绍: 用户启动项目后.载入一张图片,当用户点击图片的时候,点击的一片区域就会消失.从而显示出在这张图片以下的图片 这个小游戏相似与刮奖一样,刮开涂 ...
- 游戏的套路你知道吗? H5 Canvas刮刮乐
玩游戏的人 很多时候都会遇到翻牌子 开宝箱. 总有人傻傻的在哪里还纠结很久到底点哪一个! 纠结 指不定翻哪一个会多一点,你明明看到那个卡片的奖项多 . 那我就告诉你好了 其实很多时候在你点开那个 ...
- WP8下实现刮刮乐(橡皮擦)功能
说到刮刮乐这个功能,我们最先想到的是上下两张(长方形)重叠,之后对上面这张图片进行操作. 我的想法是:通过手势,让手指划过的地方变成透明的,底部就会显示了. 那如何让图片变为透明呢?这就要对图片的像素 ...
随机推荐
- Symantec(赛门铁克)非受管检测
为了查找局域网内没有安装赛门铁克客户端的IP,采用Symantec Endpoint Protect Manager 的非受管检测机制进行网段扫描. 非受管检测机制的原理是:每台电脑开机时都会向同网段 ...
- 「面试指南」JS数组Array常用算法,Array算法的一般解答思路
先看一道面试题 在 LeetCode 中有这么一道简单的数组算法题: // 给定一个整数数组 nums 和一个目标值 target, // 请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下 ...
- Manjaro更新后 搜狗拼音输入法突然无法正常使用
之前Manjaro已经用了很久了,很多该配置的都已经配置好了,但是搜狗拼音在系统更新后突然无法使用 1检查 如下依赖 2.检查配置文件 3.发现一切配置没问题,此时输入 sogou-qimpanel ...
- F版本SpringCloud 5—Eureka集群和自我保护机制
源码地址:https://gitee.com/bingqilinpeishenme/Java-Tutorials 前言 上篇文章中,通过代码搭建了Eureka注册中心和客户端,是Eureka的简单应用 ...
- apache 自带的ab.exe 测试网站的并发量(网站压力测试)
AB(ApacheBench) 是 Apache 自带的超文本传输协议 (HTTP) 性能测试工具. 其设计意图是描绘当前所安装的 Apache 的执行性能, 主要是显示 Apache 每秒可以处理多 ...
- CF 631C report
Each month Blake gets the report containing main economic indicators of the company "Blake Tech ...
- postman设置全局变量及参数化
笔者第一次记录使用过程,仅供参考 测试过程中接口的前缀都是一样的,所以我们可以将这个前缀作为全局变量来使用 首先,打开postman点击这里的小齿轮设置 在这里就可以进行变量的一个添加,添加好之后记住 ...
- 左手C#,右手Java
C# takes me to develop career, Java makes me more powerful. Code is poetry.
- 面向对象(OO)第一阶段学习总结
前言:对OO本阶段作业情况说明 本阶段一共完成三次作业,第一次主要是在主方法里面进行编程,也就是和之前C差不多,而随着学习的深入,慢慢了解到面向对象与面向过程的区别.作业的难度也在慢慢增大,后两次都用 ...
- elasticsearch在linux上的安装,Centos7.X elasticsearch 7.6.2
本文环境:Elasticsearch7.6.2目前最先版本 centos7.X JDK1.8 elasticsearch介绍 官网:https://www.elastic.co/cn/pr ...