自定义 View:Bitmap 和 Drawable
发布于: 刚刚
1.知识点
Bitmap 和 Drawable 如何互转?
Bitmap:位图信息的存储,即一个矩形图像每个像素的颜⾊信息的存储器。
Drawable:一个可以调用 Canvas 来进⾏绘制的上层工具;内部存储的是绘制规则;在它的 draw() 方法被调用前,需要先调⽤setBounds() 来设置绘制边界;
自定义 Drawable:
2.原理
可以专注于绘制,与 View 无关
可以存放 绘制代码,便于复用
3.代码
package com.besmart.components;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
public class DrawableView extends View {
Drawable drawable;
public DrawableView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
{
drawable = new MeshDrawable();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawable.setBounds(0, 0, (int) Util.dp2px(300), (int) Util.dp2px(300));
drawable.draw(canvas);
}
}
复制代码
package com.besmart.components;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class MeshDrawable extends Drawable {
private static final int INTERVAL = (int) Util.dp2px(80);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿
{
paint.setColor(Color.RED);
paint.setStrokeWidth(Util.dp2px(2));
}
@Override
public void draw(@NonNull Canvas canvas) {
Rect bound = getBounds();
for (int i = 0; i < bound.right; i+=INTERVAL) {
for (int j = 0; j < bound.bottom; j+=INTERVAL) {
canvas.drawLine(bound.left, j, bound.right, j, paint);
canvas.drawLine(i, bound.top, i, bound.bottom, paint);
}
}
}
@Override
public void setAlpha(int alpha) {
paint.setAlpha(alpha);
}
@Override
public int getAlpha() {
return paint.getAlpha();
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
paint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() { // 获取透明度,其实就是 画笔的透明度
return getAlpha() == 0? PixelFormat.TRANSPARENT: // 完全透明
getAlpha() == 0xff? PixelFormat.OPAQUE: // 不透明的
PixelFormat.TRANSLUCENT; // 半透明的
}
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 2
版权声明: 本文为 InfoQ 作者【Changing Lin】的原创文章。
原文链接:【http://xie.infoq.cn/article/d6ba930aa2ec685e6f92e91f9】。文章转载请联系作者。
Changing Lin
关注
获得机遇的手段远超于固有常规之上~ 2020.04.29 加入
我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。
评论