Android使用Canvas對(duì)象實(shí)現(xiàn)刮刮樂(lè)效果
在淘寶、京東等電商舉辦活動(dòng)的時(shí)候,經(jīng)常可以看到在移動(dòng)客戶端推出的各種刮獎(jiǎng)活動(dòng),而這種活動(dòng)也受到了很多人的喜愛(ài)。從客戶端的體驗(yàn)來(lái)說(shuō),這種效果應(yīng)該是通過(guò)網(wǎng)頁(yè)來(lái)實(shí)現(xiàn)的,那么,我們使用Android的自帶控件能不能實(shí)現(xiàn)這種刮刮樂(lè)的效果呢?當(dāng)然可以,本篇文章將介紹使用Canvas這個(gè)對(duì)象,如何實(shí)現(xiàn)“刮刮樂(lè)”的效果。
先看效果圖

下面我們看一下如何使用代碼實(shí)現(xiàn)
布局文件
<FrameLayout 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" >
<ImageView
android:id="@+id/after"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/a" />
<ImageView
android:id="@+id/before"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/b" />
</FrameLayout>
Activity代碼
public class MainActivity extends Activity implements OnTouchListener {
private ImageView imgafter;
private ImageView imgbefore;
private Canvas canvas;
private Paint paint;
private Bitmap bitmap;
private Bitmap before;
private Bitmap after;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imgafter = (ImageView) findViewById(R.id.after);
imgbefore = (ImageView) findViewById(R.id.before);
// 獲得圖片
after = BitmapFactory.decodeResource(getResources(), R.drawable.a);
before = BitmapFactory.decodeResource(getResources(), R.drawable.b);
imgafter.setImageBitmap(after);
imgbefore.setImageBitmap(before);
// 創(chuàng)建可以修改的空白的bitmap
bitmap = Bitmap.createBitmap(before.getWidth(), before.getHeight(),
before.getConfig());
imgbefore.setOnTouchListener(this);
paint = new Paint();
paint.setStrokeWidth(5);
paint.setColor(Color.BLACK);
// 創(chuàng)建畫布
canvas = new Canvas(bitmap);
canvas.drawBitmap(before, new Matrix(), paint);
}
@Override
public boolean onTouch(View arg0, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
int newX = (int) event.getX();
int newY = (int) event.getY();
// 將滑過(guò)的地方變?yōu)橥该?
for (int i = -10; i < 10; i++) {
for (int j = -10; j < 10; j++) {
if ((i + newX) >= before.getWidth()
|| j + newY >= before.getHeight() || i + newX < 0
|| j + newY < 0) {
return false;
}
bitmap.setPixel(i + newX, j + newY, Color.TRANSPARENT);
}
}
imgbefore.setImageBitmap(bitmap);
break;
}
return true;
}
}
可以看到,代碼很簡(jiǎn)單,幾十行代碼就實(shí)現(xiàn)了簡(jiǎn)單的“刮刮樂(lè)”的效果。
原理是這樣的,一開(kāi)始兩張圖片重疊,顯示的還沒(méi)有刮開(kāi)的效果。
在Activity的onTouch方法中,我們對(duì)滑動(dòng)事件進(jìn)行監(jiān)聽(tīng),當(dāng)用戶用手指滑動(dòng)屏幕的時(shí)候,我們將滑過(guò)的畫布部分的顏色設(shè)置為透明,同時(shí),把改變之后的bitmap對(duì)象設(shè)置為ImageView的背景,這樣,隱藏在后面的圖片就顯示出來(lái)了,也就實(shí)現(xiàn)了刮刮樂(lè)的效果。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android動(dòng)態(tài)添加menu菜單的簡(jiǎn)單方法
Android動(dòng)態(tài)添加menu菜單的簡(jiǎn)單方法,需要的朋友可以參考一下2013-06-06
Flutter改變狀態(tài)變量是否必須寫在setState回調(diào)詳解
這篇文章主要為大家介紹了Flutter改變狀態(tài)變量是否必須寫在setState回調(diào)里的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android實(shí)現(xiàn)文件按時(shí)間先后順序排列顯示的示例代碼
在很多Android應(yīng)用中,需要管理和展示本地文件,對(duì)文件按最后修改時(shí)間排序展示,能讓用戶直觀地了解文件的創(chuàng)建或修改順序,從而更方便地查找最新或最舊的文件,本文將介紹如何在Android平臺(tái)上獲取指定目錄下的文件列表,并按照時(shí)間先后排序,需要的朋友可以參考下2025-04-04
Android實(shí)現(xiàn)WebView刪除緩存的方法
這篇文章主要介紹了Android實(shí)現(xiàn)WebView刪除緩存的方法,實(shí)例分析了Android針對(duì)WebView操作緩存的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
Android沉浸式頂部實(shí)現(xiàn)代碼及效果
這篇文章主要介紹了Android沉浸式頂部實(shí)現(xiàn)代碼及效果,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Android 使用版本控制工具時(shí)添加忽略文件的方式(詳解)
下面小編就為大家?guī)?lái)一篇Android 使用版本控制工具時(shí)添加忽略文件的方式(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
android實(shí)現(xiàn)多點(diǎn)觸摸應(yīng)用
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)多點(diǎn)觸摸應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Android實(shí)現(xiàn)系統(tǒng)語(yǔ)言切換功能
這篇文章主要為大家詳細(xì)介紹了Android系統(tǒng)語(yǔ)言切換功能的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-03-03

