美文网首页
Drawable(艺术探索读书笔记)

Drawable(艺术探索读书笔记)

作者: 最美下雨天 | 来源:发表于2019-07-07 11:44 被阅读0次

按照官方的定义:可以用来绘制的东西都可以叫做Drawable

分类

BitmapDrawable、NinePatchDrawable

对应的标签时<bitmap>、<nine-patch>

  • 它们所表示的其实就是一张图片,可以通过xml来定义(放在drawable文件夹下面的),也可以直接通过java代码来定义(传入一个bitmap对象)
ShapeDrawable

对应的标签是<shape>

  • 这个是平时我们用的比较多的一个Drawable,可以理解为通过颜色构造出来的图形,这个图形可以是纯色的也可以具有渐变效果
  • ShapeDrawable有四个类型:rectangle、oval、line、ring
    可以绘制虚线、用虚线描边
  • ShapeDrawable 可以设置size属性,指定shape的宽、高,但是这个表示的是固有的宽高,如果将它设置为view的背景的话,它会自适应view的宽高
  • 啥是shape的固有宽高呢?(就是getIntrinsicWidth()、getIntrinsicHeight()获取到的)比如说对于上面讲的BitmapDrawable来说,这两个值得到的就是图片的原始大小,对于ShapeDrawable来说就是size属性的值
LayerDrawable

对应的标签是<layer-list>

  • layer-list中可以包含多个item,每个item都是一个Drawable,在item中可以通过android:top、android:bottom、android:left、android:right来控制该Drawable相对于view的上下左右的偏移量
  • 通过对item的位置的合理控制可以实现分层、叠加效果,比如说阴影的实现
StateListDrawable

对应的标签是<selector>

  • 这个标签我们平时用的也比较多,表示的是view的状态,每个item都是一个Drawable,对应view的一种状态,比如说被按下、被选择、获取到了焦点、失去焦点等等
  • StateListDrawable的固有大小会随着view的状态的改变而改变的,因为里面的item会切换,而每个item对应的Drawable的固有大小可以是不相同的,但是我们可以设置让StateListDrawable的固有大小保持不变(通过设置constantSize的值为true),这时候StateListDrawable的固有大小是所有item固有大小的最大值
LevelListDrawable

对应的标签是<level-list>

  • 有多个item,每个item对应一个Drawable,但是每个item可以设置level
android:maxLevel="10"
android:minLevel="1"

我们可以通过Drawable的setLevel()方法来改变Drawable的level,这样的话,LevelListDrawable就会选择对应的item来显示

  • Drawable的范围是0到10000,0是默认值
TransitionDrawable

对应于<transition>标签

  • 用于实现两个Drawable之间的过渡效果
InsetDrawable

对应的标签是<inset>

  • 可以将其他Drawable内嵌到自己当中并在四周留出一定的间距,当一个view希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现
自定义Drawable
public class CustomerDrawable extends Drawable {
    Paint paint;
    Context context;

    public CustomerDrawable(Paint paint, Context context) {
        this.paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        this.paint.setColor(Color.parseColor("#ff0000"));
        this.context=context;
        bitmap=BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_fish_0);
    }

    @Override
    public void draw(@NonNull Canvas canvas) {

        //绘制纯色背景
        // Rect rect=getBounds();
        // canvas.drawCircle(rect.exactCenterX(),rect.exactCenterY(),Math.min(rect.exactCenterX(),rect.exactCenterY()),paint);

        //绘制图片背景
        canvas.drawBitmap(bitmap,0,0,null);

    }
    Bitmap bitmap;

    @Override
    public void setAlpha(int alpha) {

    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {

    }

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

    @Override
    public int getIntrinsicWidth() {

        if(bitmap!=null)
        {
            return bitmap.getWidth();
        }
        return super.getIntrinsicWidth();

    }

    @Override
    public int getIntrinsicHeight() {
        if(bitmap!= null)
        {
            return bitmap.getHeight();
        }
        return super.getIntrinsicHeight();
    }
  • 这几个方法都是必须实现的,注意Drawable的getBounds方法,可以得到Drawable的实际区域的大小

相关文章

网友评论

      本文标题:Drawable(艺术探索读书笔记)

      本文链接:https://www.haomeiwen.com/subject/rcdyhctx.html