MainActivity

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}

第一种方法:

GuaTwo

public class GuaTwo extends View {/*第一种方法*/private Path mPath;//手刮动的path,过程private Paint mOutterPaint;//绘制mPath的画笔private Canvas mCanvas;//临时画布private Bitmap mBitmap;//临时图片//记录用户path每次的开始坐标值private int mLastX;private int mLastY;private Bitmap mOutterBitmap;//图片遮罩,就是手刮动,要擦掉的那张图public GuaTwo(Context context) {this(context, null);}public GuaTwo(Context context, AttributeSet attrs) {this(context, attrs, 0);}public GuaTwo(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//获得控件的宽高int width = getMeasuredWidth();int height = getMeasuredHeight();//初始化bitmapmBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);mCanvas = new Canvas(mBitmap);//设置画笔属性setupOutPaint();mCanvas.drawColor(Color.parseColor("#c0c0c0"));}@Overrideprotected void onDraw(Canvas canvas) {mOutterPaint.setStyle(Paint.Style.STROKE);mOutterPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));//Mode.DST_OUT改模式就类似橡皮檫,这个属性设置是关键canvas.drawBitmap(mOutterBitmap, 0, 0, null);canvas.drawBitmap(mBitmap, 0, 0, null);mCanvas.drawPath(mPath, mOutterPaint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {int action = event.getAction();int x = (int) event.getX();int y = (int) event.getY();switch (action) {case MotionEvent.ACTION_DOWN://按下//记录按下的时候的X和Y值,以便于之后移动的时候绘制mLastX = x;mLastY = y;mPath.moveTo(mLastX, mLastY);break;case MotionEvent.ACTION_MOVE://移动//拿到用户移动的X绝对值,Y轴绝对值int dx = Math.abs(x - mLastX);int dy = Math.abs(y - mLastY);//用户滑动超过3像素才会改变,这个可以不做,做只是为了避免很频繁的响应而已。if (dx > 3 || dy > 3) {mPath.lineTo(x, y);}mLastX = x;mLastY = y;break;}invalidate();//刷新UIreturn true;}/*** 绘制path(也就是手刮动的path来绘制) 的画笔属性* 类似橡皮擦*/private void setupOutPaint() {mOutterPaint.setColor(Color.RED);mOutterPaint.setAntiAlias(true);mOutterPaint.setDither(true);mOutterPaint.setStrokeJoin(Paint.Join.ROUND);//设置圆角mOutterPaint.setStrokeCap(Paint.Cap.ROUND);mOutterPaint.setStyle(Paint.Style.FILL);mOutterPaint.setStrokeWidth(60);//设置画笔宽度}/*** 初始化信息*/private void init() {mOutterPaint = new Paint();mPath = new Path();mOutterBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.mein);}

第二种方法:

GuaTwo

private Path mPath;//手刮动的path,过程private Paint mOutterPaint;//绘制mPath的画笔private Canvas mCanvas;private Bitmap mBitmap;//记录用户path每次的开始坐标值private int mLastX;private int mLastY;private Bitmap mOutterBitmap;//图片遮罩,就是手刮动,要擦掉的那张图private String mText;//刮奖文本信息private Rect mTextBound;private Paint mBackPaint;//刮奖信息的画笔public GuaTwo(Context context) {this(context, null);}public GuaTwo(Context context, AttributeSet attrs) {this(context, attrs, 0);}public GuaTwo(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//获得控件的宽高int width = getMeasuredWidth();int height = getMeasuredHeight();//初始化bitmapmBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);mCanvas = new Canvas(mBitmap);//用指定的位图构造一个画布来绘制。//设置画笔属性setupOutPaint();setUpBackPaint();//        mCanvas.drawColor(Color.parseColor("#c0c0c0"));mCanvas.drawRoundRect(new RectF(0, 0, width, height), 30, 30,mOutterPaint);//用mOutterPaint画圆角矩形mCanvas.drawBitmap(mOutterBitmap, null, new Rect(0, 0, width, height),null);//在刚刚画的圆角矩形上面再画一个bitmap图片,让图片大小和圆角矩形大小相关联}@Overrideprotected void onDraw(Canvas canvas) {mOutterPaint.setStyle(Paint.Style.STROKE);mOutterPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));//Mode.DST_OUT改模式就类似橡皮檫,这个属性设置是关键canvas.drawText(mText, (getWidth() - mTextBound.width()) / 2, getHeight() / 2 - mTextBound.height() / 2, mBackPaint);//把获奖信息放在正中间mCanvas.drawPath(mPath, mOutterPaint);canvas.drawBitmap(mBitmap, 0, 0, null);}@Overridepublic boolean onTouchEvent(MotionEvent event) {int action = event.getAction();int x = (int) event.getX();int y = (int) event.getY();switch (action) {case MotionEvent.ACTION_DOWN://按下//记录按下的时候的X和Y值,以便于之后移动的时候绘制mLastX = x;mLastY = y;mPath.moveTo(mLastX, mLastY);break;case MotionEvent.ACTION_MOVE://移动//拿到用户移动的X绝对值,Y轴绝对值int dx = Math.abs(x - mLastX);int dy = Math.abs(y - mLastY);//用户滑动超过3像素才会改变,这个可以不做,做只是为了避免很频繁的相应而已。if (dx > 3 || dy > 3) {mPath.lineTo(x, y);}mLastX = x;mLastY = y;break;}invalidate();//刷新UIreturn true;}private void setUpBackPaint() {mBackPaint.setColor(Color.RED);mBackPaint.setStyle(Paint.Style.FILL);mBackPaint.setTextSize(60);//获得当前画笔绘制文本的宽和高mBackPaint.getTextBounds(mText, 0, mText.length(), mTextBound);}*//*** 绘制path(也就是手刮动的path来绘制) 的画笔属性* 类似橡皮擦*//*private void setupOutPaint() {mOutterPaint.setColor(Color.RED);mOutterPaint.setAntiAlias(true);mOutterPaint.setDither(true);mOutterPaint.setStrokeJoin(Paint.Join.ROUND);//设置圆角mOutterPaint.setStrokeCap(Paint.Cap.ROUND);mOutterPaint.setStyle(Paint.Style.FILL);mOutterPaint.setStrokeWidth(60);//设置画笔宽度}*//*** 初始化信息*//*private void init() {mOutterPaint = new Paint();mPath = new Path();mOutterBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.huahua);mText = "您中奖了!";mTextBound = new Rect();mBackPaint = new Paint();}

布局文件

xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.bwie.test.guaguale.MainActivity"><com.bwie.test.guaguale.GuaTwo
        android:layout_width="wrap_content"android:layout_height="wrap_content" />
</RelativeLayout>

Android studio 刮刮乐两种方法相关推荐

  1. Android Studio自动排版的两种方法

    Android Studio这样的集成开发环境虽然代码自动化程度很高,但是自动化程度高导致人的自主性就下降了,而且总是依赖编辑器的功能也会搞得代码排版很别扭. 最难受的是你在Android Studi ...

  2. Android studio 按钮排版,Android Studio自动排版的两种方法

    解决java compiler level does not match the version of the installed java project facet 在项目目录的.setting文 ...

  3. 查找android studio版本号,Android studio版本号查看的三种方法

    Android studio版本号查看的三种方法 发布于 2016-04-10 22:50:17 | 688 次阅读 | 评论: 0 | 来源: 网友投递 Android Studio Android ...

  4. android 图片叠加xml,Android实现图片叠加效果的两种方法

    本文实例讲述了Android实现图片叠加效果的两种方法.,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // ...

  5. Android4清理代码缓存,Android清除应用缓存的两种方法

    第一种 使用ActivityManager中的clearApplicationUserData方法,代码如下: ActivityManager am = (ActivityManager) getSy ...

  6. Android实现圆形图像的两种方法(Glide和Picasso)

    Android实现圆形图像的两种方法 先上效果图 Glide Picasso CircleTransform.java(圆形图片工具类) 先上效果图 Glide 在app的build.gradle中引 ...

  7. android 画布叠加,Android实现图片叠加效果的两种方法

    本文实例讲述了Android实现图片叠加效果的两种方法.分享给大家供大家参考,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(Vi ...

  8. Android中添加背景音乐的两种方法

    前些天在尝试自己写一个Android小游戏--flybird 基本功能实现了,就想添加声音,然后上网查了查,大多是一样,可是用到我这,有些却不可以用,所以我还用了两种方法. 下面谈谈这两种方法. 方法 ...

  9. Android发送短信的两种方法

    Android发送短信代码的两种方法 Android发送短信代码的两种方法 有两种方法可以实现发送短信: 其一是使用intent-startActivity,URI数据格式为"smsto:n ...

  10. android相册如何加背景音乐,Android中添加背景音乐的两种方法

    前些天在尝试自己写一个Android小游戏--flybird 基本功能实现了,就想添加声音,然后上网查了查,大多是一样,可是用到我这,有些却不可以用,所以我还用了两种方法. 下面谈谈这两种方法. 方法 ...

最新文章

  1. php自动分配,PHP上传文件时自动分配路径的方法_php技巧
  2. java mcrypt encrypt_PHP mcrypt_encrypt加密,使用java解密
  3. LeetCode 11 盛最多水的容器
  4. jquery学习之-查找父元素方法parent() parents() closest()的区别
  5. 点云平面提取_基于LiDAR点云数据滤波方法
  6. 2017年全国大学生电子设计竞赛滚球控制系统设计
  7. 完整简单的红黑树算法
  8. hbase权限管理(访问控制标签ACL)
  9. 物联网卡不能使用的情况有哪些
  10. sql获取服务器系统时间,SQL Server取系统当前时间
  11. 13分钟搭建动易PHP论坛(OS:Linux)
  12. Mac下最好用的离线词典-欧陆词典破解版
  13. 教你用C调1645和弦,写出不一样的歌
  14. 证券公司交易系统架构演进探析
  15. 概率论与数理统计手写笔记
  16. 谁在「连接」制造业?
  17. DGIOT物联网平台简介
  18. uber司机已经激活了,就是还没有上传头
  19. 05-SA8155 QNX通过QUB配置GPIO/INT/SPI/I2C/SPI等
  20. 《地震及时通》1.0版介绍

热门文章

  1. n皇后问题python_N皇后问题(python实现)
  2. elasticsearch synonym filter 使用思考
  3. NSString使用stringWithFormat拼接
  4. iOS开发教程之:iPhone开发环境搭建
  5. The Hanoi Tower
  6. git如何克隆部分文件
  7. Prescribed Performance Control 具有预设性能的控制
  8. acm新手小白必看系列之(8)——二分法精讲及例题
  9. condition启动模式
  10. 安装mmcv-full