从新学习一下Drawable

本文详细介绍了Android中ShapeDrawable、LayerDrawable、StateListDrawable等图形绘制技术的使用方法及属性设置,帮助开发者掌握如何创建复杂的UI界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ShapeDrawable
ShapeDrawable对于Xml的shape标签,在实际开发中我们经常将其作为背景图片使用,因为ShapeDrawable可以帮助我们通过颜色来构造图片,也可以构造渐变效果的图片,总之,ShapeDrawable足矣满足我们大部分特殊需求下面我们说说其使用方法:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape=["rectangle 矩形" | "oval 椭圆" | "line 横线"| "ring 圆环"]>

    //指定边角的半径,数值越大角越圆,数值越小越趋近于直角, 参数如下:
    //Android:radius直接指定4个角的半径,另外4个属性可以单独设置4个角的角度.
   <corners
        android: radius="int"  边角的半径
        android: topLeftRadius="int"
        android: topRightRadius="int"
        android: bottomLeftRadius="int"
        android: bottomRightRadius="int" />

    //设置颜色渐变与"solid"为互斥标签,因为solid表示纯色填充,而gradient表示渐变填充。
   <gradient
       android:angle="integer"  渐变的角度,默认为0,其值务必为45°的倍数,0表示从左到右,90表示从下到上。
       android:centerX="integer"   渐变中心点的横坐标
       android:centerY="integer"   渐变的中心点的纵坐标,渐变中心点会影响渐变的具体效果。
       android:startColor="integer"渐变的开始颜色
       android:centerColor="integer"渐变的中间颜色
       android:endColor="color"     渐变的结束颜色
       android:gradientRadius="integer" 渐变的半径,当android:type=”radial”有效
       android:type=["linear (线性)为默认值 " | "radial (径内渐变)" | "sweep (扫描渐变)"]  渐变类别
       android:usesLevel=["true" | "false"]  一般为false />

    //表示内容与子标签边距,4个属性top、bottom、left、right,需要注意的是这个标签的作用是为内容设置与当前应用此shape的View的边距,而不是设置当前View与父元素的边距。
    <padding
        android:left="integer"
        android:top="integer"
        android:right="integer"
        android:bottom="integer" />

    //设置背景大小,width和height俩属性。一般来说这个值不是shape的最终显示大小,
    //因为shape作为背景时会根据View的大小而填充其背景,因此Shape的大小很多时候是View的大小决定的。
    <size
        android:width="integer"
        android:height="integer" />

    //表示纯色填充,通过android:color设置颜色即可。
    <solid
        android:color="color" />

    //描述边框(有点要明白的是android:dashWidth和android:dashGap有任意一个为0,则虚线无法预期显示)
    <stroke
        android:width="integer"  描述边框的宽度,数值越大,越边框越厚
        android:color="color" 边框的颜色
        android:dashWidth="integer" 组成虚线的线段宽度
        android:dashGap="integer" /> 组成虚线的线段之间的间隔,间隔越大,虚线看起的间隙就越大

    </shape>
LayerDrawable
一个LayerDrawable是一个可以管理一组drawable对象的drawable。在LayerDrawable的drawable资源按照列表的顺序绘制,列表的最后一个drawable绘制在最上层。LayerDrawable对于xml的标签是<layer-list>其语法如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list  xmlns:android="http://schemas.android.com/apk/res/android" >
    //一个layer-list可以包含多个item,而每个item则表示一个Drawable。
    <item
        android:drawable="@[package:]drawable/drawable_resource" //Drawable资源,可以引用已有的drawable资源,也可在item中自定义Drawable。默认情况下,layer-list中的Drawable都会被缩放至View的大小,因此在必要的情况下,我们可以使用android:gravity属性来控制图片的展示效果,防止图片变形或者被过度拉伸。
        android:id="@[+][package:]id/resource_name" //资源ID,一个为这个item定义的唯一的资源ID。 使用:”@+id/name”.这样的方式。可以检索或修改这个drawable通过下面的方式:View.findViewById() or Activity.findViewById().
        android:top="Integer"       //Drawable相对于View的顶部的偏移量,单位像素
        android:right="Integer"     //Drawable相对于View的右边的偏移量,单位像素
        android:bottom="Integer"    //Drawable相对于View的底部的偏移量,单位像素
        android:left="Integer" >   //Drawable相对于View的左边的偏移量,单位像素

            <shape android:shape="rectangle">
                 ......一些属性....
                <solid android:color="@color/colorAccent" />
                 ......等等.....
            </shape>
    <item/>
</layer-list

StateListDrawable
StateListDrawable对于xml的<selector>标签,这个标签可以说是我们最常用的标签了,在开发中,有时候我们需要一个View在点击前显示某种状态,而在点击后又切换到另外一种状态,这时我们就需要利用<selector>标签来实现啦。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize=["true" | "false"] //StateListDrawable的固有大小是否随着其状态改变而改变,因为在状态改变后,StateListDrawable会切换到别的Drawable,而不同的Drawable其大小可能不一样。true表示大小不变,这时其固有大小是内容所有Drawable的固有大小的最大值。false则会随着状态改变而改变,默认值为false
    android:dither=["true" | "false"] //是否开启抖动效果,开启后可使高质量的图片在低质量的屏幕上仍然有较好的显示效果,一般建议开启,设置为true。
    android:variablePadding=["true" | "false"] //表示 StateListDrawable的padding是否随状态的改变而改变,默认值为false,一般建议设置为false就行。 >
        <item
            android:drawable="@[package:]drawable/drawable_resource" //该状态下要显示的图像,可以是Drawable也可以是图片
            android:state_pressed=["true" | "false"]  //表示是否处于被按下状态
            android:state_focused=["true" | "false"]  //表示是否已得到焦点状态
            android:state_hovered=["true" | "false"]  //表示光标是否停留在View的自身大小范围内的状态
            android:state_selected=["true" | "false"] //表示是否处于被选中状态
            android:state_checkable=["true" | "false"]//表示是否处于可勾选状态
            android:state_checked=["true" | "false"]  //表示是否处于已勾选状态,一般用于CheckBox
            android:state_enabled=["true" | "false"]  //表示是否处于可用状态
            android:state_activated=["true" | "false"]//表示是否处于激活状态
            android:state_window_focused=["true" | "false"]//表示是否窗口已得到焦点状态
        </item>
</selector>
LevelListDrawable

LevelListDrawable对应于<level-list>标签,也表示一个Drawable的集合但集合中的每个Drawable都有一个等级。根据不同等级,LevelListDrawable会切换到相应的Drawable。

<?xml version="1.0" encoding="utf-8"?>
<level-list
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/drawable_resource" //该等级下需要展示的图片
        android:maxLevel="integer" //该项所允许的最大level
        android:minLevel="integer" //该项所允许的最小level>
    </item>

    <item  android:drawable="@drawable/image1"
            android:maxLevel="1" />

    <item  android:drawable="@drawable/image2"
           android:maxLevel="2" />
</level-list>
BitmapDrawable

BitmapDrawable 是对bitmap的一种包装,可以设置它包装的bitmap在BitmapDrawable区域内的绘制方式,如平铺填充、拉伸填充或者保持图片原始大小,也可以在BitmapDrawable区域内部使用gravity指定的对齐方式。

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"  //Drawable resource。必需。 引用一个drawable resource.
    android:antialias=["true" | "false"] //是否开启抗锯齿。开启后图片会变得更平滑些,因此一般建议开启,设置为true即可。
    android:dither=["true" | "false"]//是否允许抖动,如果位图与屏幕的像素配置不同时,开启这个选项可以让高质量的图片在低质量的屏幕上保持较好的显示效果(例如:一个位图的像素设置是 ARGB 8888,但屏幕的设置是RGB 565,开启这个选项可以是图片不过于失真)一般建议开启,为true即可。
    android:filter=["true" | "false"]//是否允许对位图进行滤波。当图片被压缩或者拉伸时,使用滤波可以获得平滑的外观效果。一般建议开启,为true即可
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |"fill_vertical" | "center_horizontal" | "fill_horizontal" |"center" | "fill" | "clip_vertical" | "clip_horizontal"]
    android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"]    //平铺模式。共有以下几个值
                                                                     disabled :默认值,表示不使用平铺
                                                                     clamp :复制边缘色彩
                                                                     repeat :X、Y 轴进行重复图片显示,也就是我们说要说的平铺
                                                                     mirror :在水平和垂直方向上使用交替镜像的方式重复图片的绘制
    />



资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在 Android 开发中,Fragment 是界面的一个模块化组件,可用于在 Activity 中灵活地添加、删除或替换。将 ListView 集成到 Fragment 中,能够实现数据的动态加载与列表形式展示,对于构建复杂且交互丰富的界面非常有帮助。本文将详细介绍如何在 Fragment 中使用 ListView。 首先,需要在 Fragment 的布局文件中添加 ListView 的 XML 定义。一个基本的 ListView 元素代码如下: 接着,创建适配器来填充 ListView 的数据。通常会使用 BaseAdapter 的子类,如 ArrayAdapter 或自定义适配器。例如,创建一个简单的 MyListAdapter,继承自 ArrayAdapter,并在构造函数中传入数据集: 在 Fragment 的 onCreateView 或 onActivityCreated 方法中,实例化 ListView 和适配器,并将适配器设置到 ListView 上: 为了提升用户体验,可以为 ListView 设置点击事件监听器: 性能优化也是关键。设置 ListView 的 android:cacheColorHint 属性可提升滚动流畅度。在 getView 方法中复用 convertView,可减少视图创建,提升性能。对于复杂需求,如异步加载数据,可使用 LoaderManager 和 CursorLoader,这能更好地管理数据加载,避免内存泄漏,支持数据变更时自动刷新。 总结来说,Fragment 中的 ListView 使用涉及布局设计、适配器创建与定制、数据绑定及事件监听。掌握这些步骤,可构建功能强大的应用。实际开发中,还需优化 ListView 性能,确保应用流畅运
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值