刮刮乐自定义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下实现刮刮乐(橡皮擦)功能
说到刮刮乐这个功能,我们最先想到的是上下两张(长方形)重叠,之后对上面这张图片进行操作. 我的想法是:通过手势,让手指划过的地方变成透明的,底部就会显示了. 那如何让图片变为透明呢?这就要对图片的像素 ...
随机推荐
- SpringMVC框架——转发与重定向
网上摘取一段大神总结的转发与重定向的区别,如下: 转发(服务端行为) 形式:request.getRequestDispatcher().forward(request,response) 转发在服务 ...
- 目标检测 | RetinaNet:Focal Loss for Dense Object Detection
论文分析了one-stage网络训练存在的类别不平衡问题,提出能根据loss大小自动调节权重的focal loss,使得模型的训练更专注于困难样本.同时,基于FPN设计了RetinaNet,在精度和速 ...
- 单片机的 HexToStr HexToBcd BcdToStr 几个转换函数
今天写单片机一个程序 要检查一些数据,想发到串口调试的软件上在电脑上查看 有些转换函数 想网上找一个 看看都是很多的垃圾文章 很多的程序都不能用,那些发文章的人也不用心 所以我还是自己动手写一下吧 写 ...
- DRF之APIView源码简析
一. 安装djangorestframework 安装的方式有以下三种,注意,模块就叫djangorestframework. 方式一:pip3 install djangorestframework ...
- Mac下 eclipse target runtime com.genuitec.runtime 解决方法
Mac下 eclipse target runtime com.genuitec.runtime 解决方法 解决步骤如下: 首先是找到工程项目一个名叫.settings的文件夹,里面有个叫 org.e ...
- 02.Go语言开发环境搭建(新版)
安装Go语言及搭建Go语言开发环境 注意:Go语言1.14版本之后推荐使用go modules管理以来,也不再需要把代码写在GOPATH目录下了 下载 下载地址 Go官网下载地址:https://go ...
- 强化学习之二:Q-Learning原理及表与神经网络的实现(Q-Learning with Tables and Neural Networks)
本文是对Arthur Juliani在Medium平台发布的强化学习系列教程的个人中文翻译.(This article is my personal translation for the tutor ...
- POJ - 1061 青蛙的约会 扩展欧几里得 + (贝祖公式)最小正整数解
题意: 青蛙 A 和 青蛙 B ,在同一纬度按照相同方向跳跃相同步数,A的起点为X ,每一步距离为m,B的起点为Y,每一步距离为 n,一圈的长度为L,求最小跳跃步数. 思路: 一开始按照追击问题来写, ...
- NKOJ4238 天天爱跑步(【NOIP2016 DAY1】)
问题描述 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一棵包 ...
- Ubuntu命令方式安装中文语言包
Ubuntu命令方式安装中文语言包 安装之前执行 $LANG 查看语言环境 中文语言包: language-pack-zh-hans 简体中文 language-pack-zh-hans-base l ...