Paint之Xfermode實(shí)現(xiàn)刮刮卡等一些列效果

前段時(shí)間,產(chǎn)品有個(gè)需求就是要搞一個(gè)抽獎(jiǎng)活動(dòng),類似支付寶的刮刮卡功能.自然想到了Paint的Xfermode.話不多說,先上效果.

刮刮卡

在Paint的使用中,有一個(gè)方法叫做setXfermode,這個(gè)方法需要傳遞一個(gè)Xfermode的實(shí)例,為了實(shí)現(xiàn)這個(gè)效果,我們使用PorterDuffXfermode中的SRC_OUT模式,先上代碼再講原理.

首先,準(zhǔn)備好兩張圖片,一張是底圖,這個(gè)是不變的 也就是最下面那張圖.一張是源圖,也就是最上層那張圖.

還是老套路,自定義控件繼承自View,在構(gòu)造方法中先初始化畫筆Paint,準(zhǔn)備好底圖以及源圖,還有一張跟源圖相同大小的透明圖片,初始化Path.

public GuaguaCard(Context context, AttributeSet attrs) {

????super(context, attrs);

????mBitPaint=newPaint();

????mBitPaint.setColor(Color.BLACK);

????mBitPaint.setStyle(Paint.Style.STROKE);

????mBitPaint.setStrokeWidth(45);

????BmpText=BitmapFactory.decodeResource(getResources(),R.drawable.guaguaka_text1,n????ull);

????BmpSRC= BitmapFactory.decodeResource(getResources(),R.drawable.guaguaka,null);

????BmpDST= Bitmap.createBitmap(BmpSRC.getWidth(),BmpSRC.getHeight(), ????Bitmap.Config.ARGB_8888);

????mPath=newPath();

}

在onDraw方法中先將BmpText繪制到畫布上.創(chuàng)建一個(gè)新圖層,然后根據(jù)將手指的移動(dòng)軌跡繪制到BmpDST上,將BmpDST繪制到畫布上,最后將BmpSRC以PorterDuff.Mode.SRC_OUT的模式繪制到canvas上.這樣底層圖片BmpText永遠(yuǎn)都在最下面的圖層,然后BmpDST與BmpSRC的混合結(jié)果將鋪在上面.這樣就可以達(dá)到我們想要的結(jié)果.

上代碼:

@Override

protected void onDraw(Canvas canvas) {

????super.onDraw(canvas);

????canvas.drawBitmap(BmpText,0,0,mBitPaint);

????//官方叫法離屏緩存

????intlayerId = canvas.saveLayer(0,0, getWidth(), getHeight(),null, ? ?????Canvas.ALL_SAVE_FLAG);

????//將path繪制到dst圖像上

????Canvas canvas1 =newCanvas(BmpDST);

????canvas1.drawPath(mPath,mBitPaint);

????//然后把目標(biāo)圖像畫到畫布上

????canvas.drawBitmap(BmpDST,0,0,mBitPaint);

????//使用Xfermode繪制源圖

????mBitPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));

????canvas.drawBitmap(BmpSRC,0,0,mBitPaint);

????// 還原混合模式

????mBitPaint.setXfermode(null);

????// 還原畫布

????canvas.restoreToCount(layerId);

? ?}

@Override

public boolean onTouchEvent(MotionEvent event) {

????switch(event.getAction()){

????case MotionEvent.ACTION_DOWN:

????mPath.moveTo(event.getX(),event.getY());

????mPreX= event.getX();

????mPreY= event.getY();

????return true;

????case MotionEvent.ACTION_MOVE:

????float endX = (mPreX+event.getX())/2;

????float endY = (mPreY+event.getY())/2;

????mPath.quadTo(mPreX,mPreY,endX,endY);

????mPreX= event.getX();

????mPreY=event.getY();

????break;

????case MotionEvent.ACTION_UP:

????break;

}

????postInvalidate();

????return super.onTouchEvent(event);

}

這里面有一個(gè)特別重要的方法就是mBitPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT))

根據(jù)PorterDuff的模式不同,展現(xiàn)的效果也不同.SRC_OUT的效果就是按照源圖片BmpSRC以及目標(biāo)圖片BmpDST的進(jìn)行組合,最終來繪制源圖片.那這個(gè)組合的方式我們來看一下源碼:

/** [Sa * (1 - Da), Sc * (1 - Da)] */

也就是根據(jù)上面的規(guī)則對(duì)源圖片以及目標(biāo)圖片的顏色ARGB通道來進(jìn)行組合,當(dāng)我手勢(shì)滑動(dòng)的時(shí)候目標(biāo)圖片的對(duì)應(yīng)區(qū)域的alpha值就變成1了,所以對(duì)應(yīng)的區(qū)域就透明了,其他區(qū)域時(shí)透明的所以對(duì)應(yīng)區(qū)域就按源圖展示,這樣就實(shí)現(xiàn)了刮刮卡效果了,是不是很神奇!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缅阳,一起剝皮案震驚了整個(gè)濱河市抛蚤,隨后出現(xiàn)的幾起案子箩艺,更是在濱河造成了極大的恐慌遍搞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盗迟,死亡現(xiàn)場離奇詭異劫侧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)葵礼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來并鸵,“玉大人鸳粉,你說我怎么就攤上這事≡暗#” “怎么了届谈?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弯汰。 經(jīng)常有香客問我艰山,道長,這世上最難降的妖魔是什么咏闪? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任曙搬,我火速辦了婚禮,結(jié)果婚禮上汤踏,老公的妹妹穿的比我還像新娘织鲸。我一直安慰自己,他們只是感情好溪胶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布搂擦。 她就那樣靜靜地躺著,像睡著了一般哗脖。 火紅的嫁衣襯著肌膚如雪瀑踢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天才避,我揣著相機(jī)與錄音橱夭,去河邊找鬼。 笑死桑逝,一個(gè)胖子當(dāng)著我的面吹牛棘劣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楞遏,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茬暇,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了寡喝?” 一聲冷哼從身側(cè)響起糙俗,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎预鬓,沒想到半個(gè)月后巧骚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年劈彪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了竣蹦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粉臊,死狀恐怖草添,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扼仲,我是刑警寧澤远寸,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站屠凶,受9級(jí)特大地震影響驰后,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矗愧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一灶芝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唉韭,春花似錦夜涕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至住诸,卻和暖如春驾胆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贱呐。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工丧诺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奄薇。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓驳阎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親馁蒂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呵晚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容