日常生活毙芜,抽獎是大多數(shù)人都喜歡的一項活動。抽獎的形式有很多種争拐,例如彩票腋粥、刮刮卡等。Android系統(tǒng)也可以實現(xiàn)刮刮卡的效果架曹,需要用到Bitmap隘冲、Matrix、Canvas等類绑雄。接下來通過一個案列來演示刮刮卡的實現(xiàn)過程展辞,具體如下。
1.創(chuàng)建程序
創(chuàng)建一個名為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覆旱,分別用于遮擋中獎信息和顯示獎結(jié)果。
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;
//創(chuàng)建一個Canvas對象
Canvas canvas = new Canvas(alterBitmap);
//創(chuàng)建畫筆對象
Paint paint = new Paint();
//為畫筆設置顏色
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
//創(chuàng)建Marix對象
Matrix matrix = new Matrix();
//在alterbitmap上畫圖
canvas.drawBitmap(bitmap,matrix,paint);
//為ImageVie設置觸摸監(jiān)聽
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++)
{
//將區(qū)域類的像書店設為透明像素
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的觸摸監(jiān)聽事件OnTouchListener()方法,當手指觸碰到該ImageView時已慢,會調(diào)用其中的setPixel(int x曲聂,int y,@Colorint int color)方法繪制圖像,其中有3個參數(shù)佑惠,參數(shù)x朋腋、yf分別獲取x、y的坐標值膜楷,參數(shù)color是設置繪圖圖像的顏色(本案例設置為透明色)旭咽。
3.運行程序
運行刮刮卡程序,并用手刮開卡片赌厅,運行結(jié)果如下:
有運行結(jié)果可以看出穷绵,當手指觸摸并在刮刮卡片上移動時,手指所到之處像素會變透明特愿,從而顯示出ImageView下面的中獎信息仲墨。