Android中的Drawable_安卓开发 drawable.getintrinsicheight() = -1-程序员宅基地

技术标签: android  

Android的Drawable

Drawable表示的是一种可以在Canvas上绘制的抽象的概念,它的种类有很多,都表示一种图像的概念,但又不全是图片,通过颜色也可以构造出各种各样的图像的效果。
Drawable的内部宽度参数比较重要,通过getIntrinsicWidth和getIntrinsicHeight可以获取到它们。但不是每个Drawable都有内部宽高,比如一张图片所形成的Drawable,它的内部宽高就是图片的宽高,而一个颜色所形成的Drawable,它就没有内部宽高,如果调用getIntrinsicWidth和getIntrinsicHeight方法,返回值是-1。但是通过设置size属性也是可以提供内部宽高这个值的。
Drawable的好处,一是比自定义View简单,二是相对于图片来说,占用的空间更小,这对减少包大小很有帮助。

常见的Drawable有

  1. BitmapDrawable
  2. ShapeDrawable
  3. LayerDrawable
  4. StateListDrawable
  5. LevelListDrawable
  6. TransitionDrawable
  7. InsetDrawable
  8. ScaleDrawable
  9. ClipDrawable

BitmapDrawable表示的是一张图片,一般开发过程中我们直接引用原始的图片就可以了,但是通过XML的形式可以设置更多的效果,比如

  1. 开启抗锯齿,开启后会让图片变得平滑,同时也会在一定程度上降低图片的清晰度,但是降低的幅度较低以至于可以忽略。这里解释下为什么会有锯齿,比如一张2190x1920的图片要展示在手机上400x400的区域,单位是像素,那么图片肯定要经过压缩了,也就是原图上好几个点才采样一个点进行展示,那么物体的边缘就不会有原图那么自然,就会出现颜色衔接不顺畅,过度不自然的效果,就是锯齿。而抗锯齿这个选项对于玩游戏的人很熟悉,通过开启这个选项,画面就会更加顺畅自然,通过设置合适的等级可以避免出现画面卡顿的现象。
  2. 开启抖动,上面的抗锯齿提到的是分辨率不一致的问题,而抖动是指色彩模式不一致的问题,比如安卓一般会使用ARGB8888来创建一张图片,而设备屏幕是RGB555,也就是某些颜色在手机上是显示不出来的,为了避免过于失真,开启抖动。抖动的原理比如有两张卡片,一张红色一张蓝色,只有两张时,人们会注意到两个颜色,现在假设一个区域有很多张很小的红色蓝色卡片交替展示,此时人们看到的是紫色。
  3. 平铺模式,可以有repeat、mirror、clamp等效果。repeat是在水平和竖直方向上平铺效果,而mirro表示的是在水平和竖直方向上的镜面投影效果,而clamp是指图片四周的像素会扩展到周围区域。

ShapeDrawable表示的是一个形状,可以是line、oval、ring、rectangle。其中line和ring必须要通过stroke标签来指定线的宽度和颜色等信息,不然无法达到预期的效果。

  1. corners,设置4个角的圆角程度,只适用于rectangle。
  2. gradient,设置渐变色,与solid是互相排斥的。其中angle这个值必须是45的整数倍,0代表从左向右,90代表从下向上。
  3. padding,注意这里设置的不是shape的padding,而是包含它的View的padding,可以想像就像是给包含它的View设置上了padding一样。
  4. size,即上面提到的固有宽高的问题,如果设置了,getIntrinsicWidth和getIntrinsicHeight即返回这里设置的值。
    其中ring效果要注意设置level属性或者使用useLevel=false,不然是出不来效果的。

LayerDrawable
一种层次化的Drawable集合,将不同的Drawable放置在不同的层上从而达到一种叠加后的效果。比如微信的文本输入框效果。

StateListDrawable
View根据不同的状态来选择合适的Drawable,系统会根据View当前的状态从selector中选择对应的item,每个item对应一个具体的Drawable,系统按照从上到下的顺序查找,直到查找到第一条匹配的item。一般来说,默认的item都应该放在selector的最后一条并且不附带任何的状态。

LevelListDrawable
同样表示一个Drawable的集合,集合中的Drawable都有一个等级level的概念,根据不同的等级,LevelListDrawable会切换到对应的Drawable上。

TransitionDrawable
用于实现两个Drawable的淡入淡出的切换效果。

InsetDrawable
它可以将其它Drawable嵌入到自己当中,并可以在四周留出一定的边距。通过LayerDrawable也可以实现这种效果。

ScaleDrawable
根据自己的等级将指定的Drawable缩放一定比例,如果等级为0,ScaleDrawable是不可见的,如果是最大值10000,那么就没有缩放效果。
大于10000,就是放大效果。同时设置的scaleWidth、scaleHeight,如果值越大,则内部的Drawable看起来越小。

ClipDrawable
根据自己当前的等级来裁剪另一个Drawable,等级同样是0~10000,等级0表示完全裁剪,即整个Drawable都不可见了,等级10000表示不裁剪。

Drawable的使用范围很单一,一个是作为ImageView的来显示 ,一个是作为View的背景来显示。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014513404/article/details/106744141

智能推荐

JDK1.6_023的版本及升级注意事项_jdka0062703-程序员宅基地

文章浏览阅读2.7k次。所有1.6系列及1.6.0_23以下的版本,存在着String.indexOf,String.contains等方法功能不正常的bug,bug地址:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6935535在某种情况下,hotspot编译出的代码会不正确执行,升级到jdk1.6.0_25可以解决这个问题。可在升级的地方,有一个已_jdka0062703

IPC——socket方式_usonia-ipc-socket-程序员宅基地

文章浏览阅读4.2k次。在socket(int domain,int type,int protocol)这个函数里,其中第一个参数指的是通信协议的协议族,其中AF_UNIX用于本地数据通信,它不用拆包组包,直接是将应用层的数据COPY至另一个进程。僵尸进程: 子进程退出后,父进程没有wait或者waitpid,子进程还没有从进程表中删除,还占用系统的进程表,太多的进程表会导致系统崩溃,所以_usonia-ipc-socket

CoreAnimation —— CAGradientLayer(颜色渐变图层)-程序员宅基地

文章浏览阅读70次。2019独角兽企业重金招聘Python工程师标准>>> ..._cagradientlayer可以设置从里到外过渡吗

Windows窗口自动缩放机制-程序员宅基地

文章浏览阅读931次。通过自动缩放功能,能使在一个计算机上设计的界面在另一个具有不同分辨率或系统字体的计算机上能正常显示。这样窗体及其控件就能通过智能化调整大小以保障在本地电脑和用户电脑上保持一致。 自动缩放的必要性 如果没有自动缩放功能,当改变显示分辨率或字体时,其对应的应用不是显得太大,就是显得太小。例如,为Tahoma 9 point字体设计的程序,在系统字体为Tahoma 12 point的计算机上运行时,..._containercontrol.performautoscale()

深度学习之循环神经网络(Recurrent Neural Network,RNN)_循环连续翻译模型-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏26次。递归神经网络和循环神经网络循环神经网络(recurrent neural network):时间上的展开,处理的是序列结构的信息,是有环图 递归神经网络(recursive neural network):空间上的展开,处理的是树状结构的信息,是无环图 二者简称都是 RNN,但是一般提到的RNN指的是循环神经网络(recurrent neural network)。为什么有bp神经网络、CNN、还需要RNN?BP神经网络和CNN的输入输出都是互相独立的;但是实际应用中有些场景输出内容和之前的内_循环连续翻译模型

Android中手势识别检测器GestureDetector_android 手势感应模块-程序员宅基地

文章浏览阅读337次。参考:http://www.jianshu.com/p/7b47be38f64apublic class MainActivity extends AppCompatActivity implements View.OnClickListener { //手势识别检测器 private GestureDetector mGestureDetector; @Ov_android 手势感应模块

随便推点

C++ 九阴真经之命令控制模式_std::function<void(args...)>-程序员宅基地

文章浏览阅读289次。所谓命令控制模式,就是对应的行为进行封装,通过命令就能控制,你可以理解为linux下指令操作。 比如一个操作包括,A1、A2、.....A10这10步操作,如果某一步失败,那么就进行倒回,如果这10个操作的业务类型各不相同,并且所需要的参数也不尽相同,操作起来就比较困难,如果我能将他们全部封装成指令模式,只通过A1到A10这10个字符串就触发,那么实现起来就容易的多。 对于网络编程,命令控制就变得必不可少了,该模型可以帮你将网络层与业务层完美的管理在一起。 实..._std::function

mini2440----keil for AMR之IIC读写EEPROM(AT24C08)_at24c08芯片资料-程序员宅基地

文章浏览阅读1.4k次。mini2440----keil for AMR之IIC读写EEPROM(AT24C08)一:EEPROM芯片介绍在这里分析AT24C02A/AT24C04A/AT24C08A,对于其他不同型号的EEPROM芯片要根据具体手册进行分析。他们的大小分别是2K(256*8)/4K(512*8)/8K(1024*8)因此可以看出实际大小是256/512/1024byte,。对于AT24C_at24c08芯片资料

MATLAB科研作图设置图片为固定大小_matlab将图像存为固定大小-程序员宅基地

文章浏览阅读2.1w次,点赞7次,收藏56次。MATLAB作图的命令中一般是以像素为单位。如果想把图片大小固定为10cm乘10cm,有两种做法。1.把单位设为cm。figure(1)set(gcf,'Units','centimeter','Position',[5 5 10 10]);但是这样做得到的图的尺寸往往并不等于10cm。2.利用像素与厘米之间的转换。(事先查到显示器的像素间距为0.277mm)figure(1)s..._matlab将图像存为固定大小

STM32 HAL I2C库读指定寄存器的数据_i2c 读写2指定寄存器-程序员宅基地

文章浏览阅读1.2w次。Support for "repeated start" in STM32 HAL I2C libraryQ:I am working with a slave I2C device (Kionix KX022 acccelerometer) which uses a "repeated start" mechanism to send data requested _i2c 读写2指定寄存器

mysql安装、启动【mac系统】-程序员宅基地

文章浏览阅读1.1k次。mysql安装后无法访问mysql下载,建议界面引导安装直接下一步下一步mysql下载,建议界面引导安装https://dev.mysql.com/downloads/mysql/直接下一步下一步安装后在系统偏好中找到mysql打开3、终端启动即可...

原始测序数据来源——SRA数据库_sequence read archive-程序员宅基地

文章浏览阅读2.5k次。一、SRA数据库简介SRA数据库SRA——Sequence Read Archive(存档来自各种高测序平台的原始测序数据和比对信息)数据(Studies(研究课题)、Experiments(实验设计)、Runs(测序结果集)、Samples(样品信息)(Studies->Experiments->Samples->Runs))SRA数据库用不同前缀表示:1、ERP或SRP表示Studies2、SRS表示Samples3、SRX表示EXperiments4、SRR表示_sequence read archive