一、环境设置
本章节学习渲染Bitmap图片。定制展示效果的Demo。
1,创建自定义控件
/** * 自定义控件 */ public class CustomView extends View { /** * 笔头设置 */ private Paint mPaint; /** * 绘图资源文件 */ private Bitmap bitmap; /** * 绘制图片左上角点坐标 */ private int x, y; public CustomView(Context context) { this(context, null); } public CustomView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaint(); initRes(context); } /** * 初始化画笔 */ private void initPaint() { // 实例化画笔并打开抗锯齿 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); /* * * 画笔样式分三种: * 1.Paint.Style.STROKE:描边 * 2.Paint.Style.FILL_AND_STROKE:描边并填充 * 3.Paint.Style.FILL:填充 */ // mPaint.setStyle(Paint.Style.STROKE); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); // 设置画笔颜色为浅灰色 mPaint.setColor(Color.LTGRAY); /* * 设置描边的粗细,单位:像素px * 注意:当setStrokeWidth(0)的时候描边宽度并不为0而是只占一个像素 */ mPaint.setStrokeWidth(10); mPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SCREEN)); } /** * 初始化资源 */ private void initRes(Context context) { // 获取位图 bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.eddie1); x = MainApplication.getApplication().getWidth() / 2 - bitmap.getWidth() / 2; y = MainApplication.getApplication().getHeight() / 2 - bitmap.getHeight() / 2; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制圆环 canvas.drawBitmap(bitmap, x, y, mPaint); } }
2,引用并展示
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.future.customcontrolseconddemo.MainActivity"> <com.future.customcontrolseconddemo.view.CustomView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
嗯哼哼,帅帅的Eddie应该是一个很好的榜样,偶像。
其中笔形设置有以下方法:
二、ColorFilter
1,ColorMatrix
修改initPaint()方法如下:
/** * 初始化画笔 */ private void initPaint() { // 实例化画笔并打开抗锯齿 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); /* * * 画笔样式分三种: * 1.Paint.Style.STROKE:描边 * 2.Paint.Style.FILL_AND_STROKE:描边并填充 * 3.Paint.Style.FILL:填充 */ // mPaint.setStyle(Paint.Style.STROKE); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); // 设置画笔颜色为浅灰色 mPaint.setColor(Color.LTGRAY); /* * 设置描边的粗细,单位:像素px * 注意:当setStrokeWidth(0)的时候描边宽度并不为0而是只占一个像素 */ mPaint.setStrokeWidth(10); // 生成色彩矩阵【原色】 --- 颜色变换 ColorMatrix colorMatrix = new ColorMatrix(new float[]{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, }); mPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); }
展示效果并没有变化啊!这是对的,因为设置的颜色矩阵是单位矩阵,也就是相当于没有做颜色变化。
ColorMatrix colorMatrix = new ColorMatrix(new float[]{ 0.5F, 0, 0, 0, 0, 0, 0.5F, 0, 0, 0, 0, 0, 0.5F, 0, 0, 0, 0, 0, 1, 0, });
展示效果:
黑白二值化:
/** * 黑白二值化 */ ColorMatrix colorMatrix = new ColorMatrix(new float[]{ 0.33F, 0.59F, 0.11F, 0, 0, 0.33F, 0.59F, 0.11F, 0, 0, 0.33F, 0.59F, 0.11F, 0, 0, 0, 0, 0, 1, 0, });
RB颜色交换:
/** * RB颜色交换 */ ColorMatrix colorMatrix = new ColorMatrix(new float[]{ 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, });
2,LightingColorFilter -- 光照模式
// 设置颜色过滤 --- 光照模式 mPaint.setColorFilter(new LightingColorFilter(0xFFFF00FF, 0x00000000)); //自然光,颜色不变 mPaint.setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x00000000)); //只剩红色 mPaint.setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x00FF0000)); //只剩黄色 ARGB mPaint.setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x00FFFF00));
设置不同的光照模式,筛选只剩黄色的样式展示如图:
3,混合模式
//设置混合模式 --- 混合模式 // mPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.DARKEN)); // mPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY)); mPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SCREEN));
混合有以下几种模式:
三、染色
染色模式有以下三种具体实现AvoidXfermode ,PixelXorXfermode,PorterDuffXfermode ,只是前两种在API16时就已经过时。
/** * 染色自定义控件 2017/12/6. */ public class AvoidXfermodeView extends View { private Paint mPaint;// 画笔 private Context mContext;// 上下文环境引用 private Bitmap bitmap;// 位图 // private AvoidXfermode avoidXfermode;// AV模式[过时] // private PixelXorXfermode avoidXfermode;// AV模式[过时] private PorterDuffXfermode porterDuffXfermode;// AV模式 private int x, y, w, h;// 位图绘制时左上角的起点坐标 public AvoidXfermodeView(Context context) { this(context, null); } public AvoidXfermodeView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mContext = context; // 初始化画笔 initPaint(); // 初始化资源 initRes(context); } private void initRes(Context context) { // 获取位图 bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.eddie2); x = MainApplication.getApplication().getWidth() / 2 - bitmap.getWidth() / 2; y = MainApplication.getApplication().getHeight() / 2 - bitmap.getHeight() / 2; w = MainApplication.getApplication().getWidth() / 2 + bitmap.getWidth() / 2; h = MainApplication.getApplication().getHeight() / 2 + bitmap.getHeight() / 2; } private void initPaint() { // 实例化画笔 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); /* * 当画布中有跟0XFFFFFFFF色不一样的地方时候才“染”色 */ // avoidXfermode = new AvoidXfermode(0XFFFFFFFF, 0, AvoidXfermode.Mode.TARGET); porterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.ADD); } public AvoidXfermodeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 先绘制位图 canvas.drawBitmap(bitmap, x, y, mPaint); // “染”什么色是由我们自己决定的 mPaint.setARGB(255, 51, 200, 113); // 设置AV模式 mPaint.setXfermode(porterDuffXfermode); // 画一个位图大小一样的矩形 canvas.drawRect(x, y, w, h, mPaint); } }
展示效果如图:
如果说岁月是年轮,我们便是推行者,如果说成长是一场华丽的蜕变,我们便是领舞者。一路走来,太多不易,告别青春的年少轻狂,我们成了岁月里被磨平的棱角,静静的守在属于自己的一亩三分地。