Android studio 刮刮乐两种方法
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 刮刮乐两种方法相关推荐
- Android Studio自动排版的两种方法
Android Studio这样的集成开发环境虽然代码自动化程度很高,但是自动化程度高导致人的自主性就下降了,而且总是依赖编辑器的功能也会搞得代码排版很别扭. 最难受的是你在Android Studi ...
- Android studio 按钮排版,Android Studio自动排版的两种方法
解决java compiler level does not match the version of the installed java project facet 在项目目录的.setting文 ...
- 查找android studio版本号,Android studio版本号查看的三种方法
Android studio版本号查看的三种方法 发布于 2016-04-10 22:50:17 | 688 次阅读 | 评论: 0 | 来源: 网友投递 Android Studio Android ...
- android 图片叠加xml,Android实现图片叠加效果的两种方法
本文实例讲述了Android实现图片叠加效果的两种方法.,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // ...
- Android4清理代码缓存,Android清除应用缓存的两种方法
第一种 使用ActivityManager中的clearApplicationUserData方法,代码如下: ActivityManager am = (ActivityManager) getSy ...
- Android实现圆形图像的两种方法(Glide和Picasso)
Android实现圆形图像的两种方法 先上效果图 Glide Picasso CircleTransform.java(圆形图片工具类) 先上效果图 Glide 在app的build.gradle中引 ...
- android 画布叠加,Android实现图片叠加效果的两种方法
本文实例讲述了Android实现图片叠加效果的两种方法.分享给大家供大家参考,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(Vi ...
- Android中添加背景音乐的两种方法
前些天在尝试自己写一个Android小游戏--flybird 基本功能实现了,就想添加声音,然后上网查了查,大多是一样,可是用到我这,有些却不可以用,所以我还用了两种方法. 下面谈谈这两种方法. 方法 ...
- Android发送短信的两种方法
Android发送短信代码的两种方法 Android发送短信代码的两种方法 有两种方法可以实现发送短信: 其一是使用intent-startActivity,URI数据格式为"smsto:n ...
- android相册如何加背景音乐,Android中添加背景音乐的两种方法
前些天在尝试自己写一个Android小游戏--flybird 基本功能实现了,就想添加声音,然后上网查了查,大多是一样,可是用到我这,有些却不可以用,所以我还用了两种方法. 下面谈谈这两种方法. 方法 ...
最新文章
- php自动分配,PHP上传文件时自动分配路径的方法_php技巧
- java mcrypt encrypt_PHP mcrypt_encrypt加密,使用java解密
- LeetCode 11 盛最多水的容器
- jquery学习之-查找父元素方法parent() parents() closest()的区别
- 点云平面提取_基于LiDAR点云数据滤波方法
- 2017年全国大学生电子设计竞赛滚球控制系统设计
- 完整简单的红黑树算法
- hbase权限管理(访问控制标签ACL)
- 物联网卡不能使用的情况有哪些
- sql获取服务器系统时间,SQL Server取系统当前时间
- 13分钟搭建动易PHP论坛(OS:Linux)
- Mac下最好用的离线词典-欧陆词典破解版
- 教你用C调1645和弦,写出不一样的歌
- 证券公司交易系统架构演进探析
- 概率论与数理统计手写笔记
- 谁在「连接」制造业?
- DGIOT物联网平台简介
- uber司机已经激活了,就是还没有上传头
- 05-SA8155 QNX通过QUB配置GPIO/INT/SPI/I2C/SPI等
- 《地震及时通》1.0版介绍