自定義控制元件(4)---PorterDuffColorFilter混合過濾器
阿新 • • 發佈:2019-02-20
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);
}
}