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>
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 }; } }
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); } }
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); } }