Android开发艺术探索——Android的Drawable

这是我在学习过程中总结的知识
目的是希望日后回来看或者需要用的时候可以 一目了然 # 的回顾、巩固、查缺补漏
不追求详细相当于书本的精简版或者说是导读(想看详细的直接对应翻书),但会尽力保证读者都能快速理解和快速使用(随理解加深会总结的更加精简),但必要时会附上一些较详细解释的链接
脚注是空白的:表示还没弄懂的知识,了解后会添加

  • 概念:Drawable表示一种可以在Canvas上进行绘制的抽象概念,种类多,常见的颜色和图片都算
  • 本章大致内容:描述Drawable的层次关系、介绍Drawable分类、介绍自定义Drawable
  • 看完本章:可实现一些特殊的UI效果,比自定义View成本低,占apk空间小

6.1 Drawable简介

  • 实际开发中常被用来作View的背景
  • 一般通过XML来定义
  • 通过代码定义较复杂
  • 内部宽高是重要参数,通过getIntrinsicWidth来获取
  • 图片所形成的Drawable内部宽高就是图片宽高
  • 颜色形成的Drawable没有内部宽高概念
  • 内部宽高不等于Drawable的大小

6.2 Drawable的分类

6.2.1 BitmapDrawable(bitmap)

最简单的Drawable,就表示一张图片,可以直接引用,也可以通过XML的方式描述它,我之前看过谷歌官方训练那里有最详细的介绍谷歌官方训练,我自己之前也总结了一份,其实没什么的,要么记住,要么用的时候翻一翻

6.2.2 ShapeDrawable(shape)

用颜色来构造图形,既可以纯色,也可以是具有渐变效果的图形(知道这个大致是用来干啥的就好,需用的时候再翻书(有作者解释)或者翻谷歌官方训练

6.2.3 LayerDrawable(layer-list)

表示一种层次化的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;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值