Android Drawable

QuibblerQuibbler 2020-04-15 约 14 分钟 1904 次阅读

Android Drawable

安卓开发中经常用到Drawable设置View的背景,那只是最基本的用法,Drawable可远不止这些,现在就来系统的学习一下Android Drawable系列。

1、Drawable

Drawable官方定义是“可以绘制的东西”的一般抽象概念。框架中有非常多的Drawable派生类,方便开发者使用:ShapeDrawable、StateListDrawable、LayerDrawable、LevelListDrawable、TransitionDrawable、InsetDrawable、ScaleDrawable、ClipDrawable等等。

Drawable系列都定义在android.graphics.drawable包中。

1.1、优点

与View不同,Drawable没有接收事件或与用户交互的任何功能。专注绘制,和Bitmap及View相比主要优点如下:

①Drawable内存占用小,绘制速度快

②Drawable有众多的派生类,且支持自定义,支持场景更丰富

③Drawable使用简单,方便快速自定义。

1.2、获取Drawable

有三种方式获取Drawable对象实例,有一些注意点:res/drawable目录下的资源会被appt工具自动优化;多个Drawable对象对应同一个res/drawable资源状态是一致的,修改其中一个其它的也会变化。参考Drawables overview。

①通过Drawable类型的构造函数

②inflate项目工程中的图片(.png、.jpg)资源:Create drawables from resource images

Resources resources = getResources();
    Drawable drawable = resources.getDrawable(R.drawable.git, getTheme());

③inflate定义可绘制属性的XML资源:Create drawables from XML resources

Drawable抽象类中有几个静态方法,创建Drawable对象,不过这些项目上不用,了解一下:

Drawable createFromPath(String pathName)
     Drawable createFromResourceStream(Resources res, TypedValue value,InputStream is, String srcName)
     Drawable createFromStream(InputStream is, String srcName)
     Drawable createFromXml(Resources r,XmlPullParser parser)
     Drawable createFromXml(Resources r,XmlPullParser parser,Theme theme)
     Drawable createFromXmlInner(Resources r,XmlPullParser parser,AttributeSet attrs)
     Drawable createFromXmlInner(Resources r,XmlPullParser parser,AttributeSet attrs,Theme theme)

1.3、使用Drawable

Drawable的使用方式有很多种,用途最主要的是用来当background背景和src资源。通过代码或者xml布局的方式使用Drawable对象或资源。

①View.setBackground(Drawable background)

②View.setBackgroundDrawable(Drawable background):Deprecated

③ImageView.setImageDrawable(Drawable drawable)

1.4、常用方法介绍

①int getIntrinsicHeight():返回可绘制对象的固有高度,默认实现返回-1,即没有固有宽度

②int getIntrinsicWidth():返回可绘制对象的固有宽度,默认实现返回-1,即没有固有宽度

③setBounds(int left, int top, int right, int bottom):为Drawable指定边界矩形。调用其draw()方法时绘制的位置。

④setBounds(Rect bounds):同上

⑤boolean setVisible(boolean visible, boolean restart):设置此Drawable是否可见

⑥setTintMode(PorterDuff.Mode tintMode):着色混合模式

⑦setLayoutDirection(int layoutDirection):设置Drawable布局方向,Drawable本身无法判断方向。

2、自定义Drawable

Android的所有版本都允许Drawable类在运行时进行扩展和使用,以代替框架提供的drawable类。从API 24开始,自定义可绘制类也可以在XML中使用。

2.1、实现自定义

自定义Drawable,只需要继承Drawable抽象基类,实现其中四个抽象方法即可。

public class CustomDrawable extends Drawable {
         @Override
         public void draw(@NonNull Canvas canvas) {
             
         }
         
         @Override
         public void setAlpha(int alpha) {
         }
         
         @Override
         public void setColorFilter(@Nullable ColorFilter colorFilter) {
         }
         
         @Override
         public int getOpacity() {
             return 0;
         }
     }

2.2、方法说明

①draw(Canvas canvas):根据可选效果(例如alpha(通过setAlpha设置)和滤色器(通过setColorFilter设置))绘制其边界(通过setBounds设置)。

②setAlpha(int alpha):指定可绘制对象的Alpha值。值范围0~255:0表示完全透明,而255表示完全不透明。通常将参数传给Paint

③setColorFilter(ColorFilter colorFilter):为可绘制对象指定可选的滤色器。通常将参数传给Paint

④int getOpacity():获取自定义Drawable的显示模式,只有下面四个取值,定义在PixelFormat类中,一般选用TRANSLUCENT值。

/** 未知 */
    public static final int UNKNOWN      = 0;
    
    / **系统选择支持半透明的格式(多alpha位)* /
    public static final int TRANSLUCENT  = -3;
    
    /** 系统选择支持透明度的格式(至少1个Alpha位) */
    public static final int TRANSPARENT  = -2;
    
    /** 系统选择不透明格式(无需Alpha位) */
    public static final int OPAQUE       = -1;

3、框架中的各种Drawable

框架中有非常多的Drawable派生类,方便开发者使用:ShapeDrawable、StateListDrawable、LayerDrawable、LevelListDrawable、TransitionDrawable、InsetDrawable、ScaleDrawable、ClipDrawable等等。

对其中常用的一一介绍详细的使用方法,由于太多,每个一篇博客单独细说。

3.1、ShapeDrawable

ShapeDrawable详见ShapeDrawable:Android自定义背景样式Shape。

3.2、StateListDrawable

StateListDrawable详见StateListDrawable:状态Drawable。

3.3、LayerDrawable

LayerDrawable详见LayerDrawable:叠加图层。

3.4、LevelListDrawable

LevelListDrawable详见LevelListDrawable:按级别选择Drawable。

3.5、TransitionDrawable

TransitionDrawable详见TransitionDrawable:淡入淡出Drawable。

3.6、InsetDrawable

InsetDrawable详见InsetDrawable:内嵌Drawable。

3.7、ScaleDrawable*

放缩Drawable,详见官方文档Scale drawable。

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    
    android:scaleGravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                          "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                          "center" | "fill" | "clip_vertical" | "clip_horizontal"]
                          
    android:scaleHeight="percentage"
    
    android:scaleWidth="percentage" />

3.8、ClipDrawable*

裁剪Drawable中定义的可绘制对象,可基于此可绘制对象的当前级别裁剪另一个Drawable。 可以根据级别控制子可绘制对象在宽度和高度上被裁剪的数量,以及重力来控制其在整个容器中的放置位置。 最常用于实现进度条之类的东西。

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    
    android:clipOrientation=["horizontal" | "vertical"]
    
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                     "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                     "center" | "fill" | "clip_vertical" | "clip_horizontal"] />

参考资料:

        Drawables overview

        Drawable resources

        Vector drawables overview

        Android中Drawable整体介绍

        Android Drawable 详解(教你画画!)

        Android中的Drawable基础与自定义Drawable

        Android Drawable 详解

        Android中的各种Drawable类详解

        

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w