Android學習筆記(四):android畫圖之paint之setXfermode


setXfermode 

設置兩張圖片相交時的模式 

我們知道 在正常的情況下,在已有的圖像上繪圖將會在其上面添加一層新的形狀。 如果新的Paint是完全不透明的,那么它將完全遮擋住下面的Paint; 

而setXfermode就可以來解決這個問題
 


一般來說 用法是這樣的 

 

Canvas canvas = new Canvas(bitmap1);

paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));

canvas.drawBitmap(mask, 0f, 0f, paint);      


就是在圖片bitmap1上面繪制圖片mask時 處理兩者相交時候顯示的問題 

canvas原有的圖片 可以理解為背景 就是dst 
新畫上去的圖片 可以理解為前景 就是src 



Mode的值 如下圖 

 

   PorterDuff.Mode.CLEAR 清除畫布上圖像 
       PorterDuff.Mode.SRC 顯示上層圖像 
       PorterDuff.Mode.DST 顯示下層圖像 
       PorterDuff.Mode.SRC_OVER上下層圖像都顯示,上層居上顯示 
       PorterDuff.Mode.DST_OVER 上下層都顯示,下層居上顯示 
       PorterDuff.Mode.SRC_IN 取兩層圖像交集部門,只顯示上層圖像 
       PorterDuff.Mode.DST_IN 取兩層圖像交集部門,只顯示下層圖像 
       PorterDuff.Mode.SRC_OUT 取上層圖像非交集部門 
       PorterDuff.Mode.DST_OUT 取下層圖像非交集部門 
       PorterDuff.Mode.SRC_ATOP 取下層圖像非交集部門與上層圖像交集部門 
       PorterDuff.Mode.DST_ATOP 取上層圖像非交集部門與下層圖像交集部門 
       PorterDuff.Mode.XOR 取兩層圖像的非交集部門

畫圖示例(畫圓角矩形軌跡 常用語市面上流行的poker倒計時):

package com.k.gameview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
 
public class GameView1 extends View implements Runnable {
    /* 聲明Paint對象 */
    private Paint mPaint = null;

    public GameView1(Context context) {
        super(context);
        /* 構建對象 */
        mPaint = new Paint();

        /* 開啟線程 */
        new Thread(this).start();
    }

    
    float arc;
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if(arc>360)
        arc=0;
        /* 設置畫布的顏色 */
        canvas.drawColor(Color.BLACK);
        
        /* 設置取消鋸齒效果 */
        mPaint.setAntiAlias(true);
        mPaint.setAlpha(255);
        if(arc>200){
            
            mPaint.setColor(Color.YELLOW);
        }else{
            
            mPaint.setColor(Color.GREEN);
        }
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(5);
        RectF rf = new RectF(10, 10, 90, 140);
        canvas.drawRoundRect(rf, 10, 10, mPaint);
        mPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        mPaint.setAlpha(0);
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawArc(new RectF(-100, -75, 200, 225), 240, arc, true, mPaint);
        arc+=2.5;
        
    }

    // 觸筆事件
    public boolean onTouchEvent(MotionEvent event) {
        return true;
    }

    // 按鍵按下事件
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return true;
    }

    // 按鍵彈起事件
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        return false;
    }

    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
        return true;
    }

    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            // 使用postInvalidate可以直接在線程中更新界面
            postInvalidate();
        }
    }
}

  

注:部分內容來源網絡


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM