这是我在学习过程中总结的知识
目的是希望日后回来看或者需要用的时候可以 一目了然 # 的回顾、巩固、查缺补漏
不追求详细相当于书本的精简版或者说是导读(想看详细的直接对应翻书),但会尽力保证读者都能快速理解和快速使用(随理解加深会总结的更加精简),但必要时会附上一些较详细解释的链接
脚注是空白的:表示还没弄懂的知识,了解后会添加
文章目录
- @[TOC]
- 6.1 Drawable简介
- 6.2 Drawable的分类
- 6.2.1 BitmapDrawable(bitmap)
- 6.2.2 ShapeDrawable(shape)
- 6.2.3 LayerDrawable(layer-list)
- 6.2.4 StateListDrawable(selector)
- 6.2.5LevelListDrawable(level-list)
- 6.2.6TransitionDrawable(transition)
- 6.2.7 InsetDrawable(inset)
- 6.2.8 ScaleDrawable(scale)
- 6.2.9 ClipDrawable(clip)
- 6.3 自定义Drawable
- 概念:Drawable表示一种可以在Canvas上进行绘制的抽象概念,种类多,常见的颜色和图片都算
- 本章大致内容:描述Drawable的层次关系、介绍Drawable分类、介绍自定义Drawable
- 看完本章:可实现一些特殊的UI效果,比自定义View成本低,占apk空间小
6.1 Drawable简介
- 实际开发中常被用来作View的背景
- 一般通过XML来定义
- 通过代码定义较复杂
- 内部宽高是重要参数,通过getIntrinsicWidth来获取
- 图片所形成的Drawable内部宽高就是图片宽高
- 颜色形成的Drawable没有内部宽高概念
- 内部宽高不等于Drawable的大小
6.2 Drawable的分类
最简单的Drawable,就表示一张图片,可以直接引用,也可以通过XML的方式描述它,我之前看过谷歌官方训练那里有最详细的介绍谷歌官方训练,我自己之前也总结了一份,其实没什么的,要么记住,要么用的时候翻一翻
用颜色来构造图形,既可以纯色,也可以是具有渐变效果的图形(知道这个大致是用来干啥的就好,需用的时候再翻书(有作者解释)或者翻谷歌官方训练)
表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加的效果
一个item标签,一个图片,然后修改他的位置达到效果
默认所有的Drawable都会被缩放至View的大小
下面的Item会覆盖上面的
书上有一个小demo
6.2.4 StateListDrawable(selector)
每个Drawable都对应着View的一种状态,系统根据View状态选择合适的Drawable,例如点击后变色
6.2.5LevelListDrawable(level-list)
根据等级切换为对应的Drawable,例如一张图片作为背景时可以把它的等级调低,作为前景时通过setLevel提高等级变成前景
6.2.6TransitionDrawable(transition)
实现两个Drawable淡入淡出的效果,要配合java代码stratTransition和reverseTransition来实现
6.2.7 InsetDrawable(inset)
将其他Drawable内嵌到自己当中,并且可以在四周留出一定间距
6.2.8 ScaleDrawable(scale)
根据等级按比例缩放Drawable(必须要设置等级大于0才会显示出来)
6.2.9 ClipDrawable(clip)
根据自己当前的等级,裁剪另一个Drawable.它是按照方向来裁剪的.作者给出了一张表来解释裁剪方向P261
等级0表示完全裁剪
8000表示裁剪掉20%的区域
6.3 自定义Drawable
- 可以通过重写Drawable的draw方法来自定义Drawable
- 通常不去自定义Drawable,因为自定义的Drawable无法再XML中使用
本小节举例实现一个自定义Drawable,绘制一个圆形,它的半径会随着View的变化而变化
public class CustomDrawable extends Drawable {
private Paint mPaint;
public CustomDrawable(int color) {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(color);
}
@Override
public void draw(Canvas canvas) {
final Rect r = getBounds();
float cx = r.exactCenterX();
float cy = r.exactCenterY();
canvas.drawCircle(cx, cy, Math.min(cx, cy), mPaint);
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
invalidateSelf();
}
@Override
public void setColorFilter(ColorFilter cf) {
mPaint.setColorFilter(cf);
invalidateSelf();
}
@Override
public int getOpacity() {
// not sure, so be safe
return PixelFormat.TRANSLUCENT;
}
}