日常生活,抽奖是大多数人都喜欢的一项活动。抽奖的形式有很多种,例如彩票、刮刮卡等。Android系统也可以实现刮刮卡的效果,需要用到Bitmap、Matrix、Canvas等类。接下来通过一个案列来演示刮刮卡的实现过程,具体如下。
1.创建程序
创建一个名为ScrCard的应用程序,指定包名为cn.itcast.scratchcard,设计用户交互界面,预览效果如图。
对应的布局代码如下:
activity_main.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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
/>
<ImageView
android:id="@+id/imgvv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/scratch_card"
/>
</RelativeLayout>
在上述代码中,RelativeLayout布局中添加了两个ImageView,分别用于遮挡中奖信息和显示奖结果。
2.编写界面交互代码
接下来在MainActivity中编写交互代码,具体代码如下。
MainActivity。java
package com.czt.scratchcard;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private Bitmap alterBitmap;
private double nX,nY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView)findViewById(R.id.imgvv);
//从资源中解析一张Bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.scratch_card);
alterBitmap = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),bitmap.getConfig());
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
nX = (double)bitmap.getWidth()/dm.widthPixels;
nY = (double)bitmap.getHeight()/dm.heightPixels;
//创建一个Canvas对象
Canvas canvas = new Canvas(alterBitmap);
//创建画笔对象
Paint paint = new Paint();
//为画笔设置颜色
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
//创建Marix对象
Matrix matrix = new Matrix();
//在alterbitmap上画图
canvas.drawBitmap(bitmap,matrix,paint);
//为ImageVie设置触摸监听
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
try {
int x = (int)event.getX();
int y = (int)event.getY();
for (int i = -100;i<100;i++)
{
for (int j = -100;j<100;j++)
{
//将区域类的像书店设为透明像素
if (Math.sqrt((i*i)+(j*j))<=100)
{
alterBitmap.setPixel((int)(x*nX)+i,(int)(y*nY+90)+j,Color.TRANSPARENT);
}
}
}
imageView.setImageBitmap(alterBitmap);
}catch (Exception e){
//try...catch捕获异常,防止用户触摸图片以为的地方而异常退出
e.printStackTrace();
}
//销毁该触摸事件
return true;
}
});
}
}
在上述代码中,用到了ImageView的触摸监听事件OnTouchListener()方法,当手指触碰到该ImageView时,会调用其中的setPixel(int x,int y,@Colorint int color)方法绘制图像,其中有3个参数,参数x、yf分别获取x、y的坐标值,参数color是设置绘图图像的颜色(本案例设置为透明色)。
3.运行程序
运行刮刮卡程序,并用手刮开卡片,运行结果如下:
有运行结果可以看出,当手指触摸并在刮刮卡片上移动时,手指所到之处像素会变透明,从而显示出ImageView下面的中奖信息。