Android里面常用的Drawable的使用

本文详细介绍了Android中五种Drawable资源:ShapeDrawable、StateListDrawable、LayerDrawable、LevelListDrawable和InsetDrawable的功能与使用方法,包括XML配置示例及关键属性解析。

一、ShapeDrawable:
通过颜色来构造图形,既可以为纯色图形,也可以为具有渐变效果的图形。能构成的图形有rectangle、oval、ring、line
1.示例:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:innerRadius="100dp"
 android:shape="ring"
 android:thickness="10dp"
 android:useLevel="false" >
 <stroke
  android:width="10dp"
  android:color="@color/colorAccent" />
</shape>

2.里面属性的介绍:
- android:shape 要绘制的形状,rectangle、oval、ring、line
- 形状的描边,有如下属性
- android:width 描边的宽度
- android:color 描边的颜色
- android:dashGap 绘制虚线的线宽
- android:dashWidth 绘制虚线的线段间隔 (要绘制虚线,后两者均不能为0)
- 纯色填充,android:color指定shape颜色
- 渐变效果,与solid不可一起用,有如下属性
- android:angle 渐变的角度,必须为45的倍数
- android:startColor 渐变的起始颜色
- android:centerColor 渐变的中间颜色
- android:endColor 渐变的结束颜色
- android:centerX 渐变的中心点横坐标
- android:centerY 渐变的中心点纵坐标
- android:gradientRadius 渐变半径
- android:type 渐变类型,linear(线性)、sweep(扫视)、radial(径向)
- 表示矩形(rectangle)的四个角的角度,不适用于其他shape ,有如下属性
- android:topLeftRadius、android:topRightRadius、android:bottomLeftRadius、android:bottomRightRadius 分别为设置左上角、右上角、左下角、右下角的角度
- android:radius 为四角设置相同角度,优先级低,会被其他四个属性覆盖
- shape的宽高,对应着android:width、android:height
- shape默认无宽高,getIntrinsicHeight、getIntrinsicWidth返回-1
- 通过size可以设置其宽高,但作为view背景时任然会被拉伸或缩小为 view大小
- 设置容纳shape的view的空白间距

二、StateListDrawable:
可以看作是一个状态选择器,通过view不同的状态选择对应的item中的drawable显示
1.示例:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@color/colorPrimaryDark" android:state_pressed="false"></item>
 <item android:drawable="@color/colorAccent" android:state_pressed="true"></item>
</selector>

2.常见状态:
android:state_pressed 当按住一个view时,按下的状态
android:state_checked 当一个view被选中时,适用于CheckBox
android:state_selected 当一个view被选择时
android:state_enabled 当一个view处于可用状态
android:state_focused 当view获取焦点

三、LayerDeawable:
表示的是一种分层的的Drawable集合,类似于ps中的图层的概念,将多个drawable放在不同的层上面形成一种叠加的效果
1.示例:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@mipmap/night" />
 <item
  android:drawable="@mipmap/photo6"
  android:gravity="center" />
</layer-list>

2.常用事项:

1、layer-list可以包含多个item,每个item表示一个drawable,并且后添加的item会覆盖到之前添加的item上面
2、默认情况下,layer-list所有的drawable都会缩放至view大大小,通过设施android:gravity可以调节缩放的效果
3、可以设置上下左右偏移量,android:top、android:bottom、android:left、android:right

四、LevelListDrawable:

表示一个drawable集合,集合中的每一个Drawable都有一个等级(level),通过设置不同的等级,可以使LevelListDrawable切换至不同的Drawable。等级范围在0~10000之间, android:maxLevel设置最大level, android:minLevel设置最小level
1.示例:

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item
  android:drawable="@mipmap/photo0"
  android:maxLevel="20"
  android:minLevel="10" />
 <item
  android:drawable="@mipmap/photo1"
  android:maxLevel="40"
  android:minLevel="30" />
</level-list>

2.通过设置level可切换不同的Drawable,在代码中:

//将ImageView的背景切换为photo1, 35 在30~40之间
iv.setImageLevel(35); 
//将ImageView的背景切换为photo0, 15在10~20之间
iv.setImageLevel(15);

五、InsetDrawable:
嵌入其他Drawable,并可以在四周保留一定的间距
1.示例:

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
 android:drawable="@mipmap/photo6"
 android:inset="20dp">
</inset>

六、ClipDrawable:
根据自己的等级(level)来对另一个Drawable进行裁剪,裁剪的方向由android:clipOrientation、android:gravity共同决定。设置level进行裁剪,level的大小从0到10000,level为0时完全不显示,为10000时完全显示 :
1.示例:

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
 android:clipOrientation="horizontal"
 android:drawable="@mipmap/night"
 android:gravity="right"></clip>

2.用法:

<ImageView
 android:id="@+id/iv_clip"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:src="@drawable/drawable_clip" />

通过设置level来裁剪:

ImageView iv = (ImageView) findViewById(R.id.iv_clip);
ClipDrawable drawable= (ClipDrawable) iv.getDrawable();
drawable.setLevel(5000); // 设置的level越大裁剪的范围越小

android:clipOrientation ,horizontal 水平方向裁剪,vertical 垂直方向裁剪
android:gravity ,配合裁剪方向

<think>好的,我现在要解决用户提到的Android中@drawable资源引用报错的问题。用户提到了具体的报错信息,比如Resources$NotFoundException,还有资源找不到的问题。我需要结合提供的引用内容来找出可能的原因和解决方案。 首先,看看引用[1],里面提到了vpi__textcolor_indicator_my.xml这个文件找不到,并且提到如果是矢量资源,可能需要启用AppCompatDelegate.setCompatVectorFromResourcesEnabled()。这可能意味着用户在使用矢量图时没有正确配置兼容性支持,导致资源无法加载。所以,我应该检查是否在应用启动前启用了这个设置。 接下来,引用[2]中的情况是用户复制文件后出现错误,但经过一些操作后问题自行解决。这可能涉及到Android Studio的缓存问题,有时候清理或重建项目可以解决资源引用的问题。因此,建议用户清理和重建项目,或者尝试Invalidate Caches / Restart。 然后,引用[3]展示了如何为Button设置不同状态的样式,其中使用了selector和item来定义不同状态下的drawable。用户可能在XML文件中错误地引用了drawable资源,比如拼写错误或者资源不存在。需要检查XML文件中的@drawable/名称是否正确,对应的资源文件是否存在,命名是否符合规范(比如不能有大写字母或特殊字符)。 用户的具体报错是@drawable/btn34找不到,所以需要确认这个资源是否存在于正确的drawable目录下,文件名是否正确。比如btn34.xml或者btn34.png等是否存在,有没有拼写错误。同时,注意资源名称是否以小写字母和下划线组成,是否符合Android的命名规则。 另外,引用[1]提到的矢量图兼容性问题,如果btn34是一个矢量图,可能需要确保在gradle文件中启用了矢量图支持,并添加了兼容性配置。例如,在build.gradle中设置vectorDrawables.useSupportLibrary = true,并在Application的onCreate中调用AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)。 还可能存在的问题是资源文件所在的drawable目录是否正确,比如是否放在了drawable-v24这样的版本限定目录中,而应用运行在较低版本的设备上,导致无法找到资源。这时候应该将资源放在不限定版本的drawable目录下。 另外,检查是否有其他同名的资源导致冲突,或者资源文件本身存在语法错误,比如XML格式不正确,这也会导致编译失败,资源无法生成。比如在引用[3]中的selector文件,如果其中的drawable引用错误,也会导致类似问题。 最后,用户可能在使用Android Studio时遇到了缓存问题,如引用[2]所述,有时候重新编译或清理项目可以解决。因此,建议用户执行Clean Project和Rebuild Project,或者使用Invalidate Caches功能。 综上所述,解决方案可能包括检查资源命名和存在性、配置矢量图兼容性、检查XML文件语法、处理缓存问题等。需要一步步引导用户排查这些可能性,并提供具体的操作步骤。</think>### @drawable资源引用报错解决方案 #### 1. **检查资源名称与路径** - **命名规则**:确保资源文件名称仅包含小写字母、数字和下划线,例如`btn34`合法,但`Btn34`或`btn-34`不合法[^3]。 - **文件存在性**:确认`res/drawable`目录下存在`btn34.xml`(矢量图)或`btn34.png`(位图)等文件。若使用XML定义的`<selector>`,需检查内部引用的子资源(如`@drawable/btn_pressed_true_shape`)是否存在。 #### 2. **矢量图兼容性配置** - 如果`btn34`是矢量图(SVG或XML格式): 1. 在`app/build.gradle`中添加配置: ```groovy android { defaultConfig { vectorDrawables.useSupportLibrary = true } } ``` 2. 在应用启动时(如`Application`类的`onCreate`方法)添加兼容支持: ```java AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); ``` 避免在`<item>`中直接引用矢量图,改用`app:srcCompat`属性(适用于ImageView)[^1]。 #### 3. **清理缓存与重建项目** - 在Android Studio中选择: - **Build > Clean Project** - **Build > Rebuild Project** - 若问题仍存在,尝试 **File > Invalidate Caches / Restart**[^2]。 #### 4. **检查XML语法与资源引用** - 示例`selector`的正确格式: ```xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/btn_pressed_true" /> <item android:drawable="@drawable/btn_default" /> </selector> ``` 确保所有`@drawable/xxx`引用有效,且无拼写错误。 #### 5. **验证资源目录与设备兼容性** - 避免将资源文件放在`drawable-v24`等版本限定目录中,否则低版本系统可能无法访问。建议使用通用目录`res/drawable`。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值