日记
其实感觉最近事情挺多的,所有最近很多博客都是中午或者晚上休息的时候写的,甚至是项目编译的时候编写的。说真的,我最近感觉,对于那种大量的时间,我反而不能很好的运用,反而对于碎片时间,我能够恰到好处的运用到位。
还是聊聊我的日常吧,我还是很喜欢追番的,我常常和别人说我追番的时候,别人总会摇摇头,然后说,追番实在太累。特别是遇到剧本写的非常好的动漫,它总是能在恰到好处的地方给你留下悬念,从而引诱你非常期待下一集,没错,说的就是你《我推的孩子》。
我重复强调了非常多次,我只是一个兴趣使然的博主,但是总是有吃了空的人说我废话太多,一笑了之~我所有博客都是对各种学习视频和书籍的小结。
正文
这次来聊聊Bitmap和Drawable到底有什么区别。首先我认为我们应该知道这两个到底分别是什么?其实计算机领域的很多东西都是可以直接顾名思义的,所以很多时候命名其实也是一种学问,多看看大佬的命名习惯,都能学到很多。不是有句话叫做:蠢材擅长把简单的东西变得复杂,天才擅长把复杂的东西变得简单,大道至简就是这个道理。命名的时候不过脑子,往往就会有非常多的后遗症,就比如说拼写错误,后面人如果要重新改方法名的话代码评审的时候就需要花费额外的功夫去评审更多的文件,还有方法反射的风险。
Bitmap翻译过来就是位图,就是一个一个像素所组成的图片信息。而Drawable翻译过来就是“可绘制的”,即Drawable定义的是视图的绘制过程(和View有点像)。
所以其实Drawable和Bitmap并没有实际上的必要联系,只是我们平时使用Drawable的时候,用它来进行图片绘制的场景比较多,所以这就导致了这两者就像“真假美猴王”一样,渐渐地难以被区分罢了。
我们完全可以来看看Android源码中对这两个类的定义:
Bitmap:
public final class Bitmap implements Parcelable
我们可以看到对于Bitmap类,官方是不支持继承的,也就是不支持自定义Bitmap的,因为Bitmap更多的像是Kotlin的Data类,里面仅仅存储了图片的相关信息。
Drawable:
public abstract class Drawable
至于Drawable,我们可以看到官方将其设置为抽象类,而且,官方就已经提供了非常多的实现。
最最常见的可能就是BitmapDrawable,我们所谓的Bitmap和Drawable互转其实就是Bitmap和BitmapDrawable之间的互转。Drawable读取Bitmap的相关信息,然后根据配置的参数,将其绘制到我们的目标视图上。
我们来看看如何自定义一个drawable:
new Drawable(){
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
@Override
public void draw(@NonNull Canvas canvas) {
//Todo:draw something...基于实际需求,根据Paint和设置的属性来进行绘制
}
@Override
public void setAlpha(int i) {
paint.setAlpha(i);//设置绘制视图的透明度
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
paint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
//简单的Demo,复杂视图该参数并不能简单如此设置
if(getAlpha() == 0) return PixelFormat.TRANSPARENT;
if(getAlpha() == 1) return PixelFormat.OPAQUE;
else return PixelFormat.TRANSLUCENT;
}
};
说了这么多,那么自定义Drawable到底有什么用呢?其实还是那个老生常谈的问题,复用和性能。
我们前面已经说到了,Drawable的作用是封装绘制的过程。我们就可以将视图中的重复的绘制逻辑封装到Drawable中,然后我们就能减少重复代码和视图绘制的层级。
awable的作用是封装绘制的过程。我们就可以将视图中的重复的绘制逻辑封装到Drawable中,然后我们就能减少重复代码和视图绘制的层级。