开发艺术探索之Drawable

Drawable表示的是一种可以在Canvas上进行绘制的抽象的概念,他的种类有很多,最常见的颜色和图片都可以是一个Drawable。

(这篇文章粗略的介绍Drawable,下一篇文章详细介绍Drawable的ShapeDrawable  )

  • Drawable简介
  • Drawable分类
  • 自定义Drawable

Drawable简介

  • Drawable有很多中,他们都表示一种图像的概念,但是他们又不全是图片,通过颜色也可以构造出各种各样的图像的效果,
  • 开发中Drawable常被用来作为View的背景使用。
  • Drawable一般通过XML来创建,(也可以使用java代码创建,但会稍显复杂)
  • 在Android设计中,Drawable是一个抽象的类,是所有Drawable对象的基类。
  • 一般来说Drawable没有大小的概念
  • Drawable可通过getIntrinsicWidth()和getIntrinsicHeight()获取其内部宽/高。

Drawable分类

详细见文章要点提炼|开发艺术之Drawable,这里只进行粗略的介绍

BitmapDrawable  (常用)表示一张图片
NinePatchDrawable .9格式的图片
ShapeDrawable  (常用) 可表示纯色、有渐变效果的基础几何图形(矩形,圆形,线条等)
LayerDrawable(常用)表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果。
StateListDrawable (常用)表示一个Drawable的集合,每个Drawable对应着View的一种状态。
LevelListDrawable   表示一个Drawable集合,集合中的每个Drawable都有一个等级的概念。
TransitionDrawable LayerDrawable的子类,实现两层 Drawable之间的淡入淡出效果。
InsetDrawable 表示把一个Drawable嵌入到另外一个Drawable的内部,并在四周留一些间距。
ScaleDrawable表示将Drawable缩放到一定比例。
ClipDrawable表示裁剪一个Drawable。

自定义Drawable

推荐阅读:Drawable绘制过程源码分析和自定义Drawable实现动画

  • Drawable的工作原理的核心是draw():系统调用Drawable的draw()来绘制View的背景或ImageView的图像。
  • Drawable使用范围单一,一是作为ImageView中的图像来显示,另外(大部分情况)就是作为View背景
  • 首先没有必要去自定义Drawable,因为自定义的Drawble无法在xml中使用,这样就降低了Drawable的使用范围
  • 必须重写其draw()、setAlpha()、setColorFilter()、getOpacity()等方法。
  • 当自定义的Drawable有固有大小时,最好重写getIntrinsicWidth()和getIntrinsicHeight(),因为它会影响到View的wrap_content布局。

自定义Drawable,绘制一个圆形的Drawable,并且它的半径会随着View的变化而变化。

//自定义Drawable
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 rect =  getBounds();
        float cx = rect.exactCenterX();
        float cy = rect.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 colorFilter) {
        mPaint.setColorFilter(colorFilter);
        invalidateSelf();
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值