系统的Drawable(一)

学习自

《Android 开发艺术探索》

《官方文档》

https://www.cnblogs.com/popfisher/p/6238119.html

http://www.runoob.com/w3cnote/android-tutorial-drawable1.html

Drawable漫谈

首先学习一个东西,先找找最权威的解释,当然是官方文档了,我先先来看看官方文档是如何描述Drawable的.

Provides classes to manage a variety of visual elements that are intended for display only, such as bitmaps and gradients. These elements are often used by widgets as background images or simply as indicators (for example, a volume level indicator).

提供一些类来管理一系列的仅用来显示的可视化元素,比如bitmap和渐变. 这些元素经常被控件用作背景或者简单地作为指示器(Indicator)(比如说,音量指示器)。

You can create most of these drawables using XML, as described in Drawable Resources.

你可以通过xml在Drawable目录下声明大多数的Drawable

现在我们对Drawable有了一个大概的认识,即Drawable时一种可视化资源,比如说简单的颜色,图片,Shape等,同时Drawable也是一个类,但是这个类的实例可以通过Xml文件的形式来创建。Drawable类是一个抽象类,位于 android.graphics.drawable 包下,所有的Drawable都继承于它。通过合理的使用Drawable我们可以减少对图片的依赖,减小APK的体积。

Drawable可以通过代码定义,也可以通过Xml文件定义,但是代码定义比较繁琐也不利于复用,所以我们一般习惯通过XML文件来定义Drawable。

Google 提供了多种Drawable,接下来我们一一学习它们。

Android系统的Drawable概览

### ColorDrawable
ColorDrawable仅仅代表的是一种颜色,所以也比较简单。
```xml

```
通过代码定义
```kotlin
var colorDrawable = ColorDrawable(0xFFF)
```

GradientDrawable

GradientDrawable,代表的是一个渐变色,会与 Shape 结合着用,Shape定义形状 GradientDrawable 定义渐变颜色.XML标签是 gradient .

渐变类型的图例



angle的图例

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:angle="0"
android:centerColor="#5F3f"
android:centerX="0.2"
android:centerY="0.2"
android:endColor="#000"
android:startColor="#FFF"
android:type="linear" />
</shape>

BitmapDrawable

BitmapDrawable就是一个Bitmap,使用的时候直接引用Bitmap即可,但是通过使用XML来描述Bitmap可以设置更多的效果.BitmapDrawable的属性如下:

属性 描述
scr 图片资源,该属性是必须设置的
antialias 是否开启抗锯齿,开启后会让图片变的平滑,建议开启
dither 抖动效果,当高质量的图片显示在低质量的屏幕上的时候,不会过于失真,建议开启
filter 过滤效果,当图片被压缩/拉伸的时候保存较好的显式效果
gravity 当图片小于容器的大小的时候,通过此属性可以为图片定位
tileMode 平铺模式,设置了此值的话gravity会失效分为 [disable] [clamp] [repeat] [mirro]
mipMap 纹理映射,不常用,默认值为false,我也没搞懂
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:antialias="true"
android:dither="true"
android:filter="true"
android:src="@drawable/dog" />

Nine-pacth Drawable

可以用来描述一个 .9图 ,个人感觉比较鸡肋,因为AS的.9图设计器非常好使,这里就不多说了,我想我几乎是不会使用XML来制作.9图的。大家如果感兴趣,可以去学习一下。

ShapeDrawable

我想这个Drawable是最常用的Drawable了,用来定义各种形状。下面是ShapeDrawable的属性:

上面的思维导图中列出的,ShapeDrawable的属性,我们来看一看这些属性的详细信息.

Shape

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring">

shape 属性定义的ShapeDrawable的形状,其中有4个值 oval(椭圆形) line(线形) rectangle(正方形) ring(环形)

solid

单色填充形状,需要注意的是,此属性和 gradient 属性是冲突的,只能生效一个。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFF" />
</shape>

gradient

这一属性在上面已经介绍过,这里就不在赘述。

corners

设置圆角,可以四个角统一设置,也可以分别设置。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="45dp" />
</shape>

padding

padding 内边距,这个属性比较奇怪,虽然它定义在Shape中,但是它代表的是View的内容与View的边距l。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#000" />
<padding
android:left="10dp"
android:top="20dp" />
</shape>

效果图如下:

size

size 代表的是Shape的__固有大小__,但是一般来说,通过size设置的大小并不是shape的最终的显式大小,在这里我们需要了解一下固有大小的概念,Drawable类有两个方法 getIntrinsicWidthgetIntrinsicHeight 来获取Drawable的固有宽高,对于BitmapDrawable来说,固有宽高代表的是Bitmap的宽和高。而Shape是默认没有固有宽高的(默认值为-1),但是如果通过了size属性为Shape设置了宽和高,那么Shape就有了固有宽高,但是这仅仅代表的是ShapeDrawable的固有宽高,但是如果Shape作为背景的话是不受固有宽高影响的依然会根据View的大小拉伸或压缩。

stroke

stroke代表的是Shape的边框.

<stroke
android:width="1dp"
android:color="#FFF"
android:dashGap="1dp"
android:dashWidth="3dp" />

属性解释:

  • width 设置边框的宽度
  • color 设置边框的颜色
  • dashGap如果设置了此值,那么边框的样式就会成为虚线,该值代表的是虚线与是虚线之间的间隔的大小
  • dashWidth 代表的是,每一条虚线的宽度

总结

这一片文章,我们主要学习了5个Drawable,其中Shape是最重要的。接线来的文章中,我们还会继续学习其他的Drawable直到学完系统的13种Drawable.

系统的Drawable(一)的更多相关文章

  1. 系统的Drawable(四)-LayerListDrawable

    系统的Drawable(四)-LayerListDrawable 学习自 https://blog.csdn.net/u014695188/article/details/52815444 Layer ...

  2. 系统的Drawable(二)-Selector

    系统的Drawable(二)-Selector Selector漫谈 Selector是定义 StateListDrawable 的标签,该Drawable代表着一个Drawable的集合,每一个Dr ...

  3. Android高效内存:让图片占用尽可能少的内存

    Android高效内存:让图片占用尽可能少的内存 一.让你的图片最小化 1.1 大图小图内存使用情况对比 大图:440 * 336    小图:220 * 168 小图的高宽都是大图的1/2--> ...

  4. Android高效内存2:让图片占用尽可能少的内存

    Android高效内存:让图片占用尽可能少的内存 一.让你的图片最小化 1.1 大图小图内存使用情况对比 大图:440 * 336    小图:220 * 168 资源目录:xhdpi 小图的高宽都是 ...

  5. Android-Drawable(三)

    Android-Drawable(三) 前两两篇文章已经学习了6个Drawable,接下来我们继续学习剩下的一些Drawable. Android系统的Drawable(一) Android系统的Dr ...

  6. ImageLoader作用 AAAA

    https://github.com/nostra13/Android-Universal-Image-Loader ImageLoader作用 1.多线程下载图片,图片可以来源于网络,文件系统,项目 ...

  7. 2012高校GIS论坛

    江苏省会议中心 南京·钟山宾馆(2012年4月21-22日) 以"突破与提升"为主题的"2012高校GIS论坛"将于4月在南京举行,由南京大学和工程中心共同承办 ...

  8. android系统自带图标集合(android.R.drawable查看)

    alert_dark_frame alert_light_frame arrow_down_float arrow_up_float bottom_bar btn_default btn_defaul ...

  9. android studio你可能忽视的细节——启动白屏?drawable和mipmap出现的意义?这里都有!!!

    android studio用了很久了,也不知道各位小伙伴有没有还在用eclipse的,如果还有,楼主真心推荐转到android studio来吧,毕竟亲儿子,你会知道除了启动速度稍微慢些,你找不到一 ...

随机推荐

  1. python学习(28) 浅谈可变对象的单例模式设计

    python开发,有时候需要设计单例模式保证操作的唯一性和安全性.理论上python语言底层实现和C/C++不同,python采取的是引用模式,当一个对象是可变对象,对其修改不会更改引用的指向,当一个 ...

  2. Kafka 0.8 NIO通信机制

    一.Kafka通信机制的整体结构 同时,这也是SEDA多线程模型. 对于broker来说,客户端连接数量有限,不会频繁新建大量连接.因此一个Acceptor thread线程处理新建连接绰绰有余. K ...

  3. spfa求图的最大流

    题目链接: https://vjudge.net/contest/255738#problem/B AC代码: #include <iostream> #include<vector ...

  4. 【API】文件操作编程基础-CreateFile、WriteFile、SetFilePointer

    1.说明 很多黑客工具的实现是通过对文件进行读写操作的,而文件读写操作实质也是对API函数的调用. 2.相关函数 CreateFile : 创建或打开文件或I/O设备.最常用的I/O设备如下:文件,文 ...

  5. pip2和pip3冲突问题解决方法

    python使用pip安装模块时报错:unable to create process using ' '的解决方法: 参考:http://qoogle.cn/?id=39 1.删除C:\Python ...

  6. 初步认识mitmproxy(一)

    在windows机器上,经常用的最多的是fiddler工具,很强大,图形化界面,使用方便.简单:在mac上,Charles 类似fiddler工具,同样是易于操作的图形化界面,同样都是通过代理的方式实 ...

  7. Redis Scan命令

    原地址:https://www.cnblogs.com/tekkaman/p/4887293.html [Redis Scan命令] SCAN cursor [MATCH pattern] [COUN ...

  8. jexus配置支持Owin

    vi打开配置文件,加一行 OwinMain=xxx.dll ###################### # Web Site: Default ########################### ...

  9. 今天我碰到了由于web.xml文件表头信息导致润乾报表启动失败的问题,解决方案如下

    下面是从2.3,2.4.2.5 3.0集中版本的web.xml头信息的细节,当发现系统启动不报错但是该生成的功能没有正常生成,特别是在这次配置润乾报表的时候发现用2.4版本的时候,在web.xml中配 ...

  10. Laravel中使用自己的类库三种方式

    虽然Composer使得我们可以重用很多现有的类库(例如packagist.org中的),但是我们仍然可能用到一些不兼容composer的包或者类库.另外在某一项目中,我们也可能会创建某一类库,而且可 ...