自定義View —— drawBitmap
最近在復(fù)習(xí)自定義view拾氓,學(xué)習(xí)了GitHub上面有一個(gè)非常詳細(xì)的自定義view的教程镰吆,就打算跟著把里面的demo都做一遍卵慰,然后記錄一下學(xué)習(xí)到的checkView梢为。教程地址
效果圖
drawBitmap
是指將一張圖片一張圖片畫在畫布上面萨咕。這里面調(diào)用的:
public void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) {}
參數(shù)的含義就很好理解了:
bitmap:畫什么圖片
src:要畫圖片中的哪個(gè)部分
dst:要把圖片畫到畫布中的哪個(gè)位置
paint:畫筆
我們這里需要的一個(gè)長圖:
這個(gè)drawBitmap方法是可以重復(fù)使用的,可以多次畫冀宴,然后畫出來的效果會(huì)疊加在一起灭贷,那么我們便可以第一次畫一個(gè)非常小的對(duì)號(hào)的一部分,然后一點(diǎn)一點(diǎn)地多略贮,最后就成為一個(gè)動(dòng)態(tài)的效果了甚疟,我們事分成了13次畫的,通過的事handler來控制實(shí)現(xiàn)的逃延。
核心代碼:
mHandler = new Handler() {
@Override public void handleMessage(Message msg) {
super.handleMessage(msg);
//確定當(dāng)前沒有view
if (animCurrentPage < animMaxPage && animCurrentPage >= 0) {
//畫一下
invalidate();
if (animState == ANIM_NULL) {
return;
}
//判斷當(dāng)前是要畫對(duì)號(hào)览妖,然后每次動(dòng)態(tài)移動(dòng)一點(diǎn)
if (animState == ANIM_CHECK) {
animCurrentPage++;
} else if (animState == ANIM_UNCHECK) {
animCurrentPage--;
}
// 延時(shí)發(fā)送消息,然后自己接收揽祥,形成了一個(gè)循環(huán)
this.sendEmptyMessageDelayed(0, animDuration / animMaxPage);
} else {
//不需要畫了黄痪,恢復(fù)到默認(rèn)值
if (isCheck) {
animCurrentPage = animMaxPage - 1;
} else {
animCurrentPage = -1;
}
invalidate();
animState = ANIM_NULL;
}
}
};
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//將畫筆移到view的中央
canvas.translate(mWidth / 2, mHeight / 2);
//畫一個(gè)圓
canvas.drawCircle(0, 0, 240, mPaint);
//找到高度
int sideLength = okBitmap.getHeight();
//控制畫出圖片上面的哪一個(gè)部分
Rect src = new Rect(sideLength * animCurrentPage, 0, sideLength * (animCurrentPage + 1), sideLength);
//畫在畫布上面的哪個(gè)位置
Rect dst = new Rect(-200, -200, 200, 200);
//畫
canvas.drawBitmap(okBitmap, src, dst, null);
}
public void check() {
//觸發(fā)想要繪畫的方法
if (animState != ANIM_NULL || isCheck) {
return;
}
animState = ANIM_CHECK;
animCurrentPage = 0;
mHandler.sendEmptyMessageDelayed(0, animDuration / animMaxPage);
isCheck = true;
}
到這里一個(gè)簡(jiǎn)單的自定義view就已經(jīng)實(shí)現(xiàn)咯~
源碼地址:https://github.com/linsir6/mCustomView/tree/master/CheckView