《Android开发艺术探索》读书笔记 (6) 第6章 Android的Drawable
本节和《Android群英传》中的第六章Android绘图机制与处理技巧有关系,建议先阅读该章的总结
第6章 Android的Drawable
6.1 Drawable简介
(1)Android的Drawable表示的是一种可以在Canvas上进行绘制的概念,它的种类很多,最常见的就是图片和颜色了。它有两个重要的优点:一是比自定义view要简单;二是非图片类型的drawable占用空间小,利于减小apk大小。
(2)Drawable是抽象类,是所有Drawable对象的基类。
(3)Drawable的内部宽/高可以通过getIntrinsicWidth和getIntrinsicHeight方法获取,但是并不是所有Drawable都有内部宽/高。图片Drawable的内部宽高就是图片的宽高,但是颜色Drawable就没有宽高的概念,它一般是作为view的背景,所以会去适应view的大小,这两个方法都是返回-1。
6.2 Drawable分类
(1)BitmapDrawable和NinePatchDrawable
<?xml version="1.0" encoding="utf-8"?> |
属性分析:android:antialias:是否开启图片抗锯齿功能。开启后会让图片变得平滑,同时也会一定程度上降低图片的清晰度,建议开启;android:dither:是否开启抖动效果。当图片的像素配置和手机屏幕像素配置不一致时,开启这个选项可以让高质量的图片在低质量的屏幕上还能保持较好的显示效果,建议开启。android:filter:是否开启过滤效果。当图片尺寸被拉伸或压缩时,开启过滤效果可以保持较好的显示效果,建议开启;android:gravity:当图片小于容器的尺寸时,设置此选项可以对图片进行定位。android:tileMode:平铺模式,有四种选项["disabled" | "clamp" | "repeat" | "mirror"]。当开启平铺模式后,gravity属性会被忽略。repeat是指水平和竖直方向上的平铺效果;mirror是指在水平和竖直方向上的镜面投影效果;clamp是指图片四周的像素会扩展到周围区域,这个比较特别。
(2)ShapeDrawable
<?xml version="1.0" encoding="utf-8"?> |
android:shape:默认的shape是矩形,line和ring这两种形状需要通过<stroke>来制定线的宽度和颜色,否则看不到效果。gradient:solid表示纯色填充,而gradient表示渐变效果。andoid:angle指渐变的角度,默认为0,其值必须是45的倍数,0表示从左到右,90表示从下到上,其他类推。padding:这个表示的是包含它的view的空白,四个属性分别表示四个方向上的padding值。size:ShapeDrawable默认情况下是没有宽高的概念的,但是可以如果指定了size,那么这个时候shape就有了所谓的固有宽高,但是作为view的背景时,shape还是会被拉伸或者缩小为view的大小。
(3)LayerDrawble
对应标签<layer-list>,表示层次化的Drawable集合,实现一种叠加后的效果。
属性android:top/left/right/bottom表示drawable相对于view的上下左右的偏移量,单位为像素。
(4)StateListDrawable
对应标签<selector>,也是表示Drawable集合,每个drawable对应着view的一种状态。
一般来说,默认的item都应该放在selector的最后一条并且不附带任何的状态。
(5)LevelListDrawable
对应标签<level-list>,同样是Drawable集合,每个drawable还有一个level值,根据不同的level,LevelListDrawable会切换不同的Drawable,level值范围从0到100000。
(6)TransitionDrawable
对应标签<transition>,它用于是吸纳两个Drawable之间的淡入淡出效果。
<transition xmlns:android="http://schemas.android.com/apk/res/android" > |
(7)InsetDrawable
对应标签<inset>,它可以将其他drawable内嵌到自己当中,并可以在四周留出一定的间距。当一个view希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现。
<inset xmlns:android="http://schemas.android.com/apk/res/android" |
(8)ScaleDrawable
对应标签<scale>,它可以根据自己的level将指定的Drawable缩放到一定比例。如果level越大,那么内部的drawable看起来就越大。
(9)ClipDrawable
对应标签<clip>,它可以根据自己当前的level来裁剪另一个drawable,裁剪方向由android:clipOrientation和andoid:gravity属性来共同控制。level越大,表示裁剪的区域越小。
<clip xmlns:android="http://schemas.android.com/apk/res/android" |
6.3 自定义Drawable
(1)Drawable的工作核心就是draw方法,所以自定义drawable就是重写draw方法,当然还有setAlpha、setColorFilter和getOpacity这几个方法。当自定义Drawable有固有大小的时候最好重写getIntrinsicWidth和getIntrinsicHeight方法。
(2)Drawable的内部大小不等于Drawable的实际区域大小,Drawable的实际区域大小可以通过它的getBounds方法来得到,一般来说它和view的尺寸相同。
其他学习资料:
1.Android样式的开发:shape篇
2.Android样式的开发:drawable篇
3.Android样式的开发:selector篇
4.Android样式的开发:layer-list篇
5.Android样式的开发:Style篇
OK,本章结束,谢谢阅读。
《Android开发艺术探索》读书笔记 (6) 第6章 Android的Drawable的更多相关文章
- Android开发艺术探索读书笔记——01 Activity的生命周期
http://www.cnblogs.com/csonezp/p/5121142.html 新买了一本书,<Android开发艺术探索>.这本书算是一本进阶书籍,适合有一定安卓开发基础,做 ...
- Android开发艺术探索读书笔记——进程间通信
1. 多进程使用场景 1) 应用某些模块由于特殊需求须要执行在单独进程中. 如消息推送,使消息推送进程与应用进程能单独存活,消息推送进程不会由于应用程序进程crash而受影响. 2) 为加大一个应用可 ...
- android开发艺术探索读书笔记之-------view的事件分发机制
View的点击事件的分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个过程就是分发过程. 分发过程主要由以下 ...
- Android开发艺术探索学习笔记(十一)
第十一章 Android的线程和线程池 从用途上来说,线程分为子线程和主线程,主线程主要处理和界面相关的事情,而子线程往往用于执行耗时的操作.AsyncTask,IntentService,Hand ...
- Android开发艺术探索学习笔记(六)
第六章 Android的Drawable Drawable的优点:使用简单,比自定义view的成本要低:非图片类型的Drawable占用空间小,有利于减小APK安装包的大小. 6.1Drawable ...
- Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧
第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...
- Android开发艺术探索学习笔记(三)
第三章 View的事件体系 3.1 View基础知识 3.1.1 什么是view View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件. 3.1.2 View的 ...
- Android开发艺术探索学习笔记(十)
第十章 Android的消息机制 面试中经常会被问到的一个问题:handler是如何在子线程和主线程中进行消息的传递的,这个问题通过了解Android的消息机制可以得到一个准确的答案. Androi ...
- Android开发艺术探索学习笔记(四)
第四章 View的工作原理 4.1初识ViewRoot和DecorView ViewRoot是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成 ...
- Android开发艺术探索学习笔记(一)
第一章 Activity的生命周期和启动模式 1.1Activity的生命周期全面解析 1.1.1典型情况下的生命周期分析 (1)在两个Activity进行切换时,当前的Activity的onPaus ...
随机推荐
- php实现的太平洋时间和北京时间互转的自定义函数
date_default_timezone_set('Asia/Shanghai'); $time = time(); } date_default_timezone_set('Pacific/Api ...
- laravel5.2学习资源
研究laravel的过程中基本把国内关于laravel的资料给翻了一遍了: 整理了一些中文的资源如下: 一:教程系列 1:https://laravist.com/series/laravel-5-b ...
- linux c静态链接库与动态链接库
库函数是我们编程的时候经常用到的,我们协作编程的时候可以将常用的函数封装成库供大家使用,这样能够提高大家的工作效率.对于库函数,它分为动态链接库和静态链接库.对于静态链接库我们必须是连接到可执行文件中 ...
- Unity3D中的Coroutine详解
Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutin ...
- C语言连接数据库
举个例子,连接SQL: // 打开数据库 strDBClass.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet ...
- W3C vs. WHATWG HTML5 Specs – The Differences Documented
A few weeks ago, HTML5 became an official W3C Recommendation. I took advantage of this event to disc ...
- OpenSource.com 评出 2014 年十佳开源软件
Docker 应用容器平台 “电源管理和虚拟化以相同的方式允许我们从服务器利用率中获取最大的利益.如何真正的解决虚拟化,这世界第一难题仍然是普遍存在的.Docker 自从 2013 年开源以来,刚好在 ...
- matlab中如何求某一个矩阵的标准差和均值
方法: 先reshape成行向量或者列向量 然后,利用mean函数,std函数. 构造测试数据,可以利用random函数,就好.利用这个函数,可以构造不同分布的随机数列(或 矩阵). 如: >& ...
- 【枚举】Vijos P1496 火柴棒等式 (NOIP2008提高组第二题)
题目链接: https://vijos.org/p/1496 题目大意: 给你n(n<24)根火柴棍,你可以拼出多少个形如“A+B=C”的等式?("+"和"=&qu ...
- wp8模拟器中使用电脑键盘和模拟器的版本解释
一:如图启用和关闭 二:电脑按键对应的手机的按键 三:模拟器的版本解释