![【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中如何自定義刮刮卡_第1頁(yè)](http://file4.renrendoc.com/view/d400b561944584c5e2529e8d92b38ee9/d400b561944584c5e2529e8d92b38ee91.gif)
![【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中如何自定義刮刮卡_第2頁(yè)](http://file4.renrendoc.com/view/d400b561944584c5e2529e8d92b38ee9/d400b561944584c5e2529e8d92b38ee92.gif)
![【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中如何自定義刮刮卡_第3頁(yè)](http://file4.renrendoc.com/view/d400b561944584c5e2529e8d92b38ee9/d400b561944584c5e2529e8d92b38ee93.gif)
![【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中如何自定義刮刮卡_第4頁(yè)](http://file4.renrendoc.com/view/d400b561944584c5e2529e8d92b38ee9/d400b561944584c5e2529e8d92b38ee94.gif)
![【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中如何自定義刮刮卡_第5頁(yè)](http://file4.renrendoc.com/view/d400b561944584c5e2529e8d92b38ee9/d400b561944584c5e2529e8d92b38ee95.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中如何自定義刮刮卡
/upload/information/20200623/125/127721.gif/upload/information/20200623/125/127722.gif所涉及的知識(shí)點(diǎn):實(shí)現(xiàn)思路://背景圖
mBackGroundBitmap
=
BitmapFactory.decodeResource(getResources(),
R.mipmap.background);
@Override
protected
void
onDraw(Canvas
canvas)
{
//繪制背景層
canvas.drawBitmap(mBackGroundBitmap,
0,
0,
null);
}//背景圖
mBackGroundBitmap
=
BitmapFactory.decodeResource(getResources(),
R.mipmap.background);
//創(chuàng)建一個(gè)和背景圖大小一致的Bitmap對(duì)象作為裝載畫布
mForeGroundBitmap
=
Bitmap.createBitmap(mBackGroundBitmap.getWidth(),
mBackGroundBitmap.getHeight(),
Config.ARGB_8888);
//與Canvas進(jìn)行綁定
mCanvas
=
new
Canvas(mForeGroundBitmap);
//涂成灰色
mCanvas.drawColor(Color.GRAY);
@Override
protected
void
onDraw(Canvas
canvas)
{
//繪制背景層
canvas.drawBitmap(mBackGroundBitmap,
0,
0,
null);
//繪制前景層
canvas.drawBitmap(mForeGroundBitmap,
0,
0,
null);
}/upload/information/20200623/125/127723.jpgmPaint
=
new
Paint();
mPaint.setAlpha(0);
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeWidth(80);
mPaint.setXfermode(new
PorterDuffXfermode(PorterDuff.Mode.DST_IN));
@Override
public
boolean
onTouchEvent(MotionEvent
event)
{
switch
(event.getAction())
{
case
MotionEvent.ACTION_DOWN:
mLastX
=
(int)
event.getX();
mLastY
=
(int)
event.getY();
mPath.moveTo(mLastX,
mLastY);
break;
case
MotionEvent.ACTION_MOVE:
mLastX
=
(int)
event.getX();
mLastY
=
(int)
event.getY();
mPath.lineTo(mLastX,
mLastY);
break;
case
MotionEvent.ACTION_UP:
break;
default:
break;
}
mCanvas.drawPath(mPath,
mPaint);
invalidate();
return
true;
}/upload/information/20200623/125/127724.png//文字畫筆
mTextPaint
=
new
Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setColor(Color.GREEN);
mTextPaint.setStyle(Paint.Style.FILL);
mTextPaint.setTextSize(30);
mTextPaint.getTextBounds(mText,
0,
mText.length(),
mRect);@Override
protected
void
onDraw(Canvas
canvas)
{
canvas.drawText(mText,
mBitmap.getWidth()
/
2
-
mRect.width()
/
2,
mBitmap.getHeight()
/
2
+
mRect.height()
/
2,
mTextPaint);
}//通過(guò)資源文件創(chuàng)建Bitmap對(duì)象
mBitmap
=
BitmapFactory.decodeResource(getResources(),
R.mipmap.background);
//新建同等大小的Bitmap對(duì)象
mForeBitmap
=
Bitmap.createBitmap(mBitmap.getWidth(),
mBitmap.getHeight(),
Bitmap.Config.ARGB_8888);
//雙緩沖,裝載畫布
mForeCanvas
=
new
Canvas(mForeBitmap);
mForeCanvas.drawBitmap(mBitmap,
0,
0,
null);private
Runnable
mRunnable
=
new
Runnable()
{
int[]
pixels;
@Override
public
void
run()
{
int
w
=
mForeBitmap.getWidth();
int
h
=
mForeBitmap.getHeight();
float
wipeArea
=
0;
float
totalArea
=
w
*
h;
pixels
=
new
int[w
*
h];
/**
*
pixels
接收位圖顏色值的數(shù)組
*
offset
寫入到pixels[]中的第一個(gè)像素索引值
*
stride
pixels[]中的行間距個(gè)數(shù)值(必須大于等于位圖寬度)。可以為負(fù)數(shù)
*
x
從位圖中讀取的第一個(gè)像素的x坐標(biāo)值。
*
y
從位圖中讀取的第一個(gè)像素的y坐標(biāo)值
*
width
從每一行中讀取的像素寬度
*
height
讀取的行數(shù)
*/
mForeBitmap.getPixels(pixels,
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
(pixels[index]
==
0)
{
wipeArea++;
}
}
}
if
(wipeArea
>
0
&&
totalArea
>
0)
{
int
percent
=
(int)
(wipeArea
*
100
/
totalArea);
if
(percent
>
50)
{
isClear
=
true;
postInvalidate();
}
}
}
};/upload/information/20200623/125/127725.png
@Override
protected
void
onDraw(Canvas
canvas)
{
canvas.drawText(mText,
mForeBitmap.getWidth()
/
2
-
mRect.width()
/
2,
mForeBitmap.getHeight()
/
2
+
mRect.height()
/
2,
mTextPaint);
if
(!isClear)
{
canvas.drawBitmap(mForeBitmap,
0,
0,
null);
}
}package
com.lcw.view;
import
android.content.Context;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
android.graphics.Canvas;
import
android.graphics.Color;
import
android.graphics.Paint;
import
android.graphics.Path;
import
android.graphics.PorterDuff;
import
android.graphics.PorterDuffXfermode;
import
android.graphics.Rect;
import
android.util.AttributeSet;
import
android.view.MotionEvent;
import
android.view.View;
/**
*
刮刮卡(完善版)
*
Create
by:
chenwei.li
*
Date:
2017/7/22
*
Time:
下午7:25
*/
public
class
ScratchCardView2
extends
View
{
//處理文字
private
String
mText
=
"恭喜您中獎(jiǎng)啦!!";
private
Paint
mTextPaint;
private
Rect
mRect;
//處理圖層
private
Paint
mForePaint;
private
Path
mPath;
private
Bitmap
mBitmap;//加載資源文件
private
Canvas
mForeCanvas;//前景圖Canvas
private
Bitmap
mForeBitmap;//前景圖Bitmap
//記錄位置
private
int
mLastX;
private
int
mLastY;
private
volatile
boolean
isClear;//標(biāo)志是否被清除
public
ScratchCardView2(Context
context)
{
this(context,
null);
}
public
ScratchCardView2(Context
context,
AttributeSet
attrs)
{
this(context,
attrs,
0);
}
public
ScratchCardView2(Context
context,
AttributeSet
attrs,
int
defStyleAttr)
{
super(context,
attrs,
defStyleAttr);
init();
}
private
void
init()
{
mRect
=
new
Rect();
mPath
=
new
Path();
//文字畫筆
mTextPaint
=
new
Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setColor(Color.GREEN);
mTextPaint.setStyle(Paint.Style.FILL);
mTextPaint.setTextSize(30);
mTextPaint.getTextBounds(mText,
0,
mText.length(),
mRect);
//擦除畫筆
mForePaint
=
new
Paint();
mForePaint.setAntiAlias(true);
mForePaint.setAlpha(0);
mForePaint.setStrokeCap(Paint.Cap.ROUND);
mForePaint.setStrokeJoin(Paint.Join.ROUND);
mForePaint.setStyle(Paint.Style.STROKE);
mForePaint.setStrokeWidth(30);
mForePaint.setXfermode(new
PorterDuffXfermode(PorterDuff.Mode.DST_IN));
//通過(guò)資源文件創(chuàng)建Bitmap對(duì)象
mBitmap
=
BitmapFactory.decodeResource(getResources(),
R.mipmap.background);
mForeBitmap
=
Bitmap.createBitmap(mBitmap.getWidth(),
mBitmap.getHeight(),
Bitmap.Config.ARGB_8888);
//雙緩沖,裝載畫布
mForeCanvas
=
new
Canvas(mForeBitmap);
mForeCanvas.drawBitmap(mBitmap,
0,
0,
null);
}
@Override
protected
void
onDraw(Canvas
canvas)
{
canvas.drawText(mText,
mForeBitmap.getWidth()
/
2
-
mRect.width()
/
2,
mForeBitmap.getHeight()
/
2
+
mRect.height()
/
2,
mTextPaint);
if
(!isClear)
{
canvas.drawBitmap(mForeBitmap,
0,
0,
null);
}
}
@Override
public
boolean
onTouchEvent(MotionEvent
event)
{
switch
(event.getAction())
{
case
MotionEvent.ACTION_DOWN:
mLastX
=
(int)
event.getX();
mLastY
=
(int)
event.getY();
mPath.moveTo(mLastX,
mLastY);
break;
case
MotionEvent.ACTION_MOVE:
mLastX
=
(int)
event.getX();
mLastY
=
(int)
event.getY();
mPath.lineTo(mLastX,
mLastY);
break;
case
MotionEvent.ACTION_UP:
new
Thread(mRunnable).start();
break;
default:
break;
}
mForeCanvas.drawPath(mPath,
mForePaint);
invalidate();
return
true;
}
/**
*
開啟子線程計(jì)算被擦除的像素點(diǎn)
*/
private
Runnable
mRunnable
=
new
Runnable()
{
int[]
pixels;
@Override
public
void
run()
{
int
w
=
mForeBitmap.getWidth();
int
h
=
mForeBitmap.getHeight();
flo
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年護(hù)眼鹵制營(yíng)養(yǎng)品行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年按摩椅家庭影院組合企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 2025-2030年地震災(zāi)后搜救機(jī)器人行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年扇貝裙邊罐頭禮盒行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年即食酸奶果粒杯企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 2025-2030年可調(diào)節(jié)RGB燈光效果的耳機(jī)行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年地中海風(fēng)情堅(jiān)果拼盤企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 工業(yè)機(jī)器人智能維護(hù)與遠(yuǎn)程診斷考核試卷
- 光伏組件的壽命預(yù)測(cè)模型考核試卷
- 摩托車的設(shè)計(jì)與市場(chǎng)需求考核試卷
- 江蘇省鹽城市鹿鳴路初級(jí)中學(xué)2024-2025學(xué)年八年級(jí)上學(xué)期期末考試語(yǔ)文試題(含答案)
- 【物理】《跨學(xué)科實(shí)踐:制作簡(jiǎn)易桿秤》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年人教版(2024)初中物理八年級(jí)下冊(cè)
- 新蘇教版一年級(jí)數(shù)學(xué)下冊(cè)第六單元《簡(jiǎn)單的數(shù)量關(guān)系(一)》教案(共2課時(shí))
- 浙江省寧波市九校2024-2025學(xué)年高一上學(xué)期期末聯(lián)考試題 數(shù)學(xué) 含答案
- GA/T 2146-2024法庭科學(xué)涉火案件物證檢驗(yàn)移動(dòng)實(shí)驗(yàn)室建設(shè)通用要求
- 北京市石景山區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期末考試數(shù)學(xué)試卷(含答案)
- 2025年度服務(wù)外包合同:銀行呼叫中心服務(wù)外包協(xié)議3篇
- 【課件】跨學(xué)科實(shí)踐制作微型密度計(jì)++課件人教版物理八年級(jí)下冊(cè)
- 杜邦公司十大安全理念
- Module 2 Unit 2 I dont like ginger. (說(shuō)課稿)-2024-2025學(xué)年外研版(一起)英語(yǔ)二年級(jí)上冊(cè)
- 廣聯(lián)達(dá)2024算量軟件操作步驟詳解
評(píng)論
0/150
提交評(píng)論