@TryLoveCatch
2022-05-05T16:39:52.000000Z
字数 2355
阅读 1023
Android知识体系
一般Drawable
都会有两种方式来表示,一种就是代码里面直接new,另一种就是使用xml,接下来我都会从这两个方向来介绍。
ConstantState
可以参看上一篇Bitmap优化之一张图片实现点击效果
里面的介绍:
Drawable
比作一个绘制容器,那么ConstantState
就是容器中真正的内容。ConstantState
是Drawable
的静态内部类。具体的实现都在Drawable
子类里面
我们在研究各个Drawable
的时候,可以注意一下,基本上每一个Drawable
都会有一个内部类ConstantState
。
ColorDrawable drawable = new ColorDrawable(0xffff2200);
txtShow.setBackground(drawable);
<?xml version="1.0" encoding="utf-8"?>
<color
xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#FF0000"/>
对于ColorDrawable
,其实,我们一般都不会这么使用,我们一般都是在colors.xml
里面定义一个color,然后再代码或者xml里面使用。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="color_r">#fff5f5f5</color>
</resources>
txtShow.setBackgroundColor(R.color.color_r);
我们可以看下setBackgroundColor()
的源码:
public void setBackgroundColor(int color) {
if (mBackground instanceof ColorDrawable) {
((ColorDrawable) mBackground.mutate()).setColor(color);
computeOpaqueFlags();
mBackgroundResource = 0;
} else {
setBackground(new ColorDrawable(color));
}
}
很显然,它也是构造了一个ColorDrawable
,然后调用的setBackground()
这个应该也是咱们经常用到的,它就是.9图片了。这个就比较简单,大多数,我们都是直接使用切图来实现的,这个了解就行,NinePatchDrawable
是给系统用的,我们基本上用不到。
最常用的Drawable
BitmapDrawable bitDrawable = new BitmapDrawable(bitmap);
bitDrawable.setDither(true);
bitDrawable.setTileModeXY(TileMode.MIRROR,TileMode.MIRROR);
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@[package:]drawable/drawable_resource"
android:antialias=["true" | "false"]
android:dither=["true" | "false"]
android:filter=["true" | "false"]
android:gravity=["top" | "bottom" | "left" | "right" |
"center_vertical" | "fill_vertical" |
"center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" |
"clip_horizontal"]
android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />
src:图片资源~
antialias:是否支持抗锯齿
filter:是否支持位图过滤,支持的话可以是图片显示时比较光滑,为了使图片被放大或者缩小时有一个较好的显示效果
dither:是否对位图进行抖动处理,作用是手机像素配置和图片像素配置不一致时,系统会自动调整显示效果。例如:一个位图的像素设置是 ARGB 8888,但屏幕的设置是RGB 565。
gravity:若位图比容器小,可以设置位图在容器中的相对位置
tileMode:指定图片平铺填充容器的模式,设置这个的话,gravity属性会被忽略,有以下可选值:
disabled(不平铺位图。这是默认值),clamp(原图大小),
repeat(平铺),mirror(镜像平铺)
当我们在这里使用了除disable之外的另外三种取值时,gravity属性值失效。
关于titleMode的几个值,我们直接上图说效果:
原图:
repeat:
clamp:
mirror:为了说明效果,换了一张图
Xml方式,可以对原始的位图进行一系列的处理,比如说抗锯齿,拉伸,对齐等等。
Google官方文档
Android中的13种Drawable小结
Android Drawable Resource学习(二)、BitmapDrawable和Bitmap
玩转Android之Drawable的使用