开发者社区> zx0301> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

android刮刮卡的实现

简介: 看了一个教程跟上做的,分享出来给大家看看直接上源码  MainActivity .java public class MainActivity extends Activity {guaguaView mgg ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.
+关注继续查看

看了一个教程跟上做的,分享出来给大家看看直接上源码

 MainActivity .java


public class MainActivity extends Activity {
guaguaView mgg ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mgg = (guaguaView) findViewById(R.id.guagua);
mgg.setOnGuaGuaCompleteListener(new OnGuaGuaComplete() {

@Override
public void complete() {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "您中了500w!!", Toast.LENGTH_SHORT).show();
}
});
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}


activity_main.xml



<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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=".MainActivity" 
    android:orientation="horizontal">


<com.zx.guagua.view.guaguaView  
   android:id="@+id/guagua"
   android:layout_width="200dp"
   android:layout_height="150dp"
   android:layout_gravity="center"
   />
</LinearLayout>


guaguaView.java

public class guaguaView extends View {

private Paint mOutterPain = null;

private Path mPath;//记录用户滑动的轨迹

private Canvas mCanvas;//画布

private Bitmap mBitmap;//图片

private int mLastX ;

private int mLastY;

//-----------------------------------//

private Bitmap bitmap;
//-----------------------------------//

private String mText;
private Paint mBackPaint;
private int textSize;

//判断只改遮盖层区域是否消除达到阈值
private volatile boolean mComplete = false;
/**
* 刮刮卡刮完调用的接口

* */
public interface OnGuaGuaComplete{
void complete();
}
private OnGuaGuaComplete mListener;

public void setOnGuaGuaCompleteListener(OnGuaGuaComplete mListener){
this.mListener = mListener;
}
/**
* 记录刮奖信息文本的宽和高
* */
private Rect mTextBound;

public guaguaView(Context context) {
this(context,null);
}


public guaguaView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}


public guaguaView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//获取页面的宽和高
int width = getMeasuredWidth();
int height = getMeasuredHeight();
//初始化我们的bitMap
mBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
setOutPaint();
setUpBackPaint();
mCanvas.drawColor(Color.parseColor("#e0e0e0"));


}
/**
* 设置我们绘制获奖信息的画笔属性

* */
private void setUpBackPaint() {
mBackPaint.setColor(Color.BLACK);
mBackPaint.setStyle(Style.FILL);
mBackPaint.setTextSize(textSize);
//获得当前画笔绘制文本的宽和高
mBackPaint.getTextBounds(mText, 0, mText.length(), mTextBound);
}


/**
* 进行一些初始化操作
* */
private void init() {
mOutterPain = new Paint();
mPath = new Path();
bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.z12);

mText = "500万大奖!!";
mTextBound = new Rect();
mBackPaint = new Paint();
textSize = 30;
}
/**
* 设置绘制path画笔的一些属性
* */
private void setOutPaint(){
mOutterPain.setColor(Color.RED);
mOutterPain.setAntiAlias(true);
mOutterPain.setDither(true);
mOutterPain.setStrokeJoin(Paint.Join.ROUND);
mOutterPain.setStrokeCap(Paint.Cap.ROUND);
mOutterPain.setStyle(Style.STROKE);
mOutterPain.setStrokeWidth(20);
}
@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){//移动小于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;
int[] mPixels = new int[w*h];
//获得Bitmap上所有的像素信息
mBitmap.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){
wipeArea++;
}
}
}
if(wipeArea>0&&totalArea>0){
int percent = (int)(wipeArea*100/totalArea);
Log.e("zx", percent+"");
if(percent>60){
mComplete = true;
postInvalidate();
}
}
}
};
@Override//图形绘制
protected void onDraw(Canvas canvas) {
canvas.drawText(mText, getWidth()/2-mTextBound.width()/2, getHeight()/2+mTextBound.height()/2, mBackPaint);
if(mComplete){
if(mListener!=null){
mListener.complete();
}
}
if(!mComplete){
drawPath();
canvas.drawBitmap(mBitmap, 0,0, null);
}
}


private void drawPath() {
mOutterPain.setXfermode(new PorterDuffXfermode(Mode.DST_OUT));
mCanvas.drawPath(mPath, mOutterPain);
}
}

分享一下学习网站,慕课网

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android Studio进行APP设计开发之矢量图及XML文件转换
Android Studio进行APP设计开发之矢量图及XML文件转换
0 0
Android studio开发APP时设置更改启动时的主界面程序
Android studio开发APP时设置更改启动时的主界面程序
0 0
Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案
Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案
0 0
Android开发:使用Java对手机截图图片进行任意区域的颜色对比度处理操作
开发项目过程中,对于手机屏幕截图,需要对获取到的截图的任意部分进行区域颜色对比度的识别操作,由此判定任意指定区域是否满足某对比度基本标准,但是该功能在网上任何地方都没有找到过Java方面的代码,于是根据RGB转换测试的原理:即获取每个像素点的RGB,通过RGB对比度定义公式进行像素点的集合换取。
0 0
开发android项目的常用jar包
开发android项目的常用jar包
0 0
Android Studio开发Android APP
Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。 Android Studio 主窗口由下图标注的几个逻辑区域组成:
0 0
开发时遇到监听的事件处理机制和SoundPool播放音效解决方法以及外部类的使用【Android】
开发时遇到监听的事件处理机制和SoundPool播放音效解决方法以及外部类的使用【Android】
0 0
【Android】开发Android应用时对于Handler消息传递与缓存问题深入运用and理解
【Android】开发Android应用时对于Handler消息传递与缓存问题深入运用and理解
0 0
ANDROID开发之http调试常见错误
ANDROID开发之http调试常见错误
0 0
+关注
zx0301
编程语言,算法相关技术专家
文章
问答
文章排行榜
最热
最新
相关电子书
更多
《深入探索Android热修复技术原理》
立即下载
Android组件化实现
立即下载
手机卫士性能优化方案-Android篇
立即下载