我是靠谱客的博主 刻苦小霸王,最近开发中收集的这篇文章主要介绍Bitmap和Drawable1 什么是Drawable2 Bitmap和Drawable是怎么互转的3 自定义Drawable,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1 什么是Drawable

在自定义View的时候,经常会出现Bitmap和Drawable互相转换的情况。

先写一个最简单的Drawable:

public class DrawableView extends View {
Drawable drawable = new ColorDrawable(Color.RED);
public DrawableView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawable.setBounds(0, 0, getWidth(), getHeight()); // 设置drawable绘制边界,要提供绘制边界才能让drawable绘制出来
// 绘制drawable,这里传入了canvas,其实内部最终还是通过canvas.drawXXX()实现
// 所以这里的drawable其实就是一种绘制规则,比如ColorDrawable就是用来绘制颜色,BitmapDrawable就是用来绘制Bitmap
drawable.draw(canvas);
}
}

可以发现View和Drawable好像很像,View和Drawable不同的地方在于,View是需要测量、布局和绘制,而Drawable只做绘制处理。

View绘制的使用的Canvas是较为底层的绘制实现,而Drawable是Canvas之上的绘制。

Drawble是什么?Drawable是一套绘制规则,可以将Drawable当成是一个只能绘制的View

2 Bitmap和Drawable是怎么互转的

Bitmap转Drawable
Drawable drawable = new BitmapDrawable(getResources(), bitmap);
Drawable转Bitmap
// 上面提到Drawable是一种绘制规则,那么是怎么转成Bitmap的?完全不搭边的两个东西
// 其实就是自己硬生生的创建了一个Bitmap出来
public static Bitmap drawableToBitmap(Drawable drawable) {
Bitmap bitmap = null;
// 如果drawable是BitmapDrawable,也就是本来就有一个bitmap,那么直接返回就行了
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if (bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
// 如果不是BitmapDrawable,那么就创建一个Bitmap,使用Canvas将它画出来
if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}

严格来讲,Bitmap和Drawable是两个不同的东西,它们的互转更确切的说应该是用一个生产出另一个。

3 自定义Drawable

// 画网格线
public class MeshDrawable extends Drawable {
private static final float INTERVAL = Utils.dp2px(80); // 网格线之间的间隔
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
{
paint.setColor(Color.RED);
paint.setStrokeWidth(Utils.dp2px(5));
}
// 绘制
@Override
public void draw(Canvas canvas) {
Rect bounds = getBounds();
// 画竖线,横坐标变化纵坐标不变
for (float x = bounds.left; x < bounds.rigth; x += INTERVAL) {
canvas.drawLine(x, bounds.top, x, bounds.bottom, paint);
}
// 画横线,纵坐标变化横坐标不变
for (float y = bounds.top; y < bounds.bottom; y += INTERVAL) {
canvas.drawLine(bounds.left, y, bounds.right, y, paint);
}
}
// 设置drawable的透明度
@Override
public void setAlpha(int alpha) {
paint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
paint.setColorFilter(colorFilter);
}
// 对透明度的比例,有三种情况:透明、半透明、完全不透明
@Override
public int getOpacity() {
return paint.getAlpha() == 0 ? PixelFormat.TRANSPARENT :
paint.getAlpha() == 0xff ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT;
}
}
public class DrawableView extends View {
Drawable drawable = new MeshDrawable();
public DrawableView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawable.setBounds(0, 0, getWidth(), getHeight());
drawable.draw(canvas);
}
}

上面就是自定义Drawable,其实和绘制一个View是基本一样的。那么就有一个问题了,自定义Drawable有用吗?sdk都提供了足够多的支持了,还需要吗?

自定义Drawable的好处是可以做到重用,比如两个自定义的View,它们有共同的功能信息,那么这两个自定义View就可以重用这个自定义Drawable,提高性能,就不会出现重复代码的问题了

最后

以上就是刻苦小霸王为你收集整理的Bitmap和Drawable1 什么是Drawable2 Bitmap和Drawable是怎么互转的3 自定义Drawable的全部内容,希望文章能够帮你解决Bitmap和Drawable1 什么是Drawable2 Bitmap和Drawable是怎么互转的3 自定义Drawable所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部