1. 程式人生 > >自定義控制元件(4)---PorterDuffColorFilter混合過濾器

自定義控制元件(4)---PorterDuffColorFilter混合過濾器

PorterDuffColorFilter跟LightingColorFilter一樣,只有一個構造方法

PorterDuffColorFilter(int color, PorterDuff.Mode mode)

這個構造方法也接受兩個值,一個是16進製表示的顏色值這個很好理解,而另一個是PorterDuff內部類Mode中的一個常量值,這個值表示混合模式。那麼什麼是混合模式呢?混合混合必定是有兩種東西混才行,第一種就是我們設定的color值而第二種當然就是我們畫布上的元素了!,比如這裡我們把Color的值設為紅色,而模式設為PorterDuff.Mode.DARKEN變暗:

PorterDuff.Mode中的模式不僅僅是應用於影象色彩混合,還應用於圖形混合,這篇是圖形色彩混合

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" >

    <com.aigestudio.customviewdemo.views.CustomView
        android:id="@+id/main_cv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

MeasureUtil
package com.aigestudio.customviewdemo.views;

import android.app.Activity;
import android.util.DisplayMetrics;

/**
 * 測繪工具類
 */
public final class MeasureUtil {
	/**
	 * 獲取螢幕尺寸
	 * 
	 * @param activity
	 *            Activity
	 * @return 螢幕尺寸畫素值,下標為0的值為寬,下標為1的值為高
	 */
	public static int[] getScreenSize(Activity activity) {
		DisplayMetrics metrics = new DisplayMetrics();
		activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
		return new int[] { metrics.widthPixels, metrics.heightPixels };
	}
}

MainActivity
package com.aigestudio.customviewdemo.activities;

import android.app.Activity;
import android.os.Bundle;

import com.aigestudio.customviewdemo.R;
import com.aigestudio.customviewdemo.views.CustomView;

public class MainActivity extends Activity {
	private CustomView mCustomView;// 我們的自定義View

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 獲取控制元件
		mCustomView = (CustomView) findViewById(R.id.main_cv);

	}
}

CustomView
package com.aigestudio.customviewdemo.views;

import android.app.Activity;
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.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.util.AttributeSet;
import android.view.View;

import com.aigestudio.customviewdemo.R;

public class CustomView extends View {
	private Paint mPaint;// 畫筆
	private Context mContext;// 上下文環境引用
	private Bitmap bitmap;// 點陣圖

	private int x, y;// 點陣圖繪製時左上角的起點座標

	public CustomView(Context context) {
		this(context, null);
	}

	public CustomView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;

		// 初始化畫筆
		initPaint();

		// 初始化資源
		initRes(context);
	}

	/**
	 * 初始化畫筆
	 */
	private void initPaint() {
		// 例項化畫筆
		mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

		// 設定顏色過濾
		mPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.DARKEN));
	}

	/**
	 * 初始化資源
	 */
	private void initRes(Context context) {
		// 獲取點陣圖
		bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.a);

		/*
		 * 計算點陣圖繪製時左上角的座標使其位於螢幕中心
		 * 螢幕座標x軸向左偏移點陣圖一半的寬度
		 * 螢幕座標y軸向上偏移點陣圖一半的高度
		 */
		x = MeasureUtil.getScreenSize((Activity) mContext)[0] / 2 - bitmap.getWidth() / 2;
		y = MeasureUtil.getScreenSize((Activity) mContext)[1] / 2 - bitmap.getHeight() / 2;
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		// 繪製點陣圖
		canvas.drawBitmap(bitmap, x, y, mPaint);
	}
}