我的编程空间,编程开发者的网络收藏夹
学习永远不晚

玩转Android之Drawable的使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

玩转Android之Drawable的使用

Drawable天天用,可你是否对Drawable家族有一个完整的认知?今天我们就来系统的学习一下Drawable的使用。

1.概述
用过Drawable的筒子都知道Drawable有很多种,有的时候Drawable是一张图片,有的时候Drawable是我们通过颜色构造出来的某种图形。最常见的自己构造的Drawable图形莫过于ShapeDrawable,我们在开发中可能经常需要自己绘制一个矩形、圆形、椭圆等等各种各样的图形。一般来说,Drawable并没大小的概念(虽然可以通过getIntrinsicHeight和getIntrinsicWidth两个方法获取Drawable的宽和高,但是这两个方法并不总是有效,因为如果我们的Drawable是图片的话,那么Drawable的大小就是图片的大小,如果我们的Drawable本身就是颜色的话,那么就没有宽高的概念),因为我们在用Drawable的时候,大多数时候都是把它当作某一个控件的背景来使用的,此时Drawable会被拉伸到和View相同的大小,此时Drawable的大小实际上就是控件的大小。接下来我们来看看Drawable的继承关系:

在Drawable的这些继承类中我们常用的主要有以下几种:LayerDrawable、ShapeDrawable、NinePatchDrawable、BitmapDrawable、StateListDrawable、LevelListDrawable、TransitionDrawable、InsetDrawable、ScaleDrawable、ClipDrawable等,下面我们会就这些不同的Drawable一一介绍。

2.BitmapDrawable
BitmapDrawable算是最最最最常见的Drawable之一,我们构造一个Bitmap对象的时候,有时候会用到BitmapDrawable,那么BitmapDrawable的构造,除了在代码中new一个BitmaDrawable之外,我们还可以使用XML来构造一个BitmapDrawable对象,在项目的drawable文件中新创建一个xml文件,代码如下:


<?xml version="1.0" encoding="utf-8"?> 
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
  android:antialias="true" 
  android:class="lazy" data-src="@drawable/a2w" 
  android:dither="true" 
  android:filter="true" 
  android:gravity="top|left" 
  android:tileMode="mirror" 
 > 
</bitmap> 

这里只有class="lazy" data-src属性是必须的,该属性指这个BitmapDrawable要显示的图片,其他属性看单词意思都很容易明白,antialias表示是否开启抗锯齿,这个在自定义View创建Paint时经常用到;dither表示是否开启抖动效果,作用是手机像素配置和图片像素配置不一致时,系统会自动调整显示效果,关于图片像素问题参见Android开发之Bitmap二次采样文章;filter表示是否开启过滤效果,这个属性也是为了使图片被放大或者缩小时有一个较好的显示效果;gravity属性则表示当图片的大小小于控件的大小时,图片的显示位置,tileMode表示平铺模式,在我们的Windows电脑桌面设置的时候就有这个选项,该属性共有四种取值,分别是disable、repeat、mirror、clamp四种,默认情况下是disable,就是不做任何处理,当我们在这里使用了除disable之外的另外三种取值时,gravity属性值失效。下面我们来看看这三种取值时的效果:
我的原图是这样的:

我的bitmapdrawable是这样的:


<?xml version="1.0" encoding="utf-8"?> 
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
  android:antialias="true" 
  android:class="lazy" data-src="@drawable/p2" 
  android:dither="true" 
  android:filter="true" 
  android:gravity="top|left" 
  android:tileMode="repeat" 
 > 
</bitmap> 

我的View是这样的:


<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
 xmlns:android="http://schemas.android.com/apk/res/android" 
 xmlns:tools="http://schemas.android.com/tools" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 tools:context="org.mobiletrain.drawable.MainActivity"> 
 <View 
  android:layout_width="400dp" 
  android:layout_height="400dp" 
  android:background="@drawable/mybitmap"/> 
</RelativeLayout> 

这是显示效果是这样的:


大家看到,当图片的大小小于控件的大小时,图片会在水平方向和垂直方向不断的重复。如果我把tileMode属性的值改为clamp,我们再来看看显示效果:

大家看到,这时当图片小于控件的大小时,图片在水平方向或者垂直方向末端的颜色会自动延伸直至将控件填充满。最后我们再来看看mirror属性,为了方便看到效果,我这里把图片换一下,我们再来看看显示效果:


大家看到一个小飞机在水平方向和垂直方向以倒影的形式在不断的重复。这就是mirror的显示效果。

3.ShapeDrawable
shapeDrawable又是一个非常常用的Drawable,我们在开发中对于纯色的背景一般来说都是绘制的,因为直接使用图片会使App打包后变得比较大,通过XML来绘制纯色背景是一个不错的选择。关于这个我这里就不再多说了,大家查看这篇文章自行了解。android开发之shape详解。

4.LayerDrawable
LayerDrawable表示一个层次化的Drawable,这个要怎么理解呢?大家看看我之前的这篇文章就理解了博客关于ProgressBar的美化问题。
LayerDrawable中可以有n多个item,每个item就是一个Drawable,每一个Drawable依据代码的顺序相互覆盖着显示出来。先写的先绘制,后写的后绘制,最终显示的效果是一个叠加的显示效果,我们来看下面一个例子:


<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
<item> 
 <shape android:shape="rectangle"> 
  <solid android:color="@color/lineColor"/> 
 </shape> 
</item> 
 <item android:bottom="8dp"> 
  <shape android:shape="rectangle"> 
   <solid android:color="@color/lineColor2"/> 
  </shape> 
 </item> 
 <item android:bottom="1dp" android:left="1dp" android:right="1dp"> 
  <shape android:shape="rectangle"> 
   <solid android:color="@color/etbg"/> 
  </shape> 
 </item> 
</layer-list> 

我把这个Drawable作为EditText的背景,代码如下:


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
 android:orientation="vertical" 
 xmlns:android="http://schemas.android.com/apk/res/android" 
 xmlns:tools="http://schemas.android.com/tools" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:padding="8dp" 
 tools:context="org.mobiletrain.drawable.MainActivity"> 
 <EditText 
  android:background="@drawable/textview_background" 
  android:layout_width="match_parent" 
  android:text="江南一点雨" 
  android:layout_height="wrap_content"/> 
 <EditText 
  android:text="江南一点雨" 
  android:layout_marginTop="20dp" 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content"/> 
</LinearLayout> 

显示效果如下(上面是加了背景的显示效果,下面是正常的EditText的显示效果):


大家看到,上面的EditText有一点不同,原因在于我在LayerDrawable中首先绘制了一个蓝色的矩形,然后又绘制了一个绿色的矩形,但是这个绿色矩形距离底部有8dp的高度,这就保证了输入框有两个向上翘起的蓝色边框,最后绘制整个背景色,整个背景色为黄色,但是背景色距离左右下三边的距离分别为1dp,这样就确保了另外三条线可以正常显示出来。OK,就是这么简单,更酷炫的用法参见关于ProgressBar的美化问题。

5.LevelListDrawable
LevelListDrawable,顾名思义就是一个等级Drawable,它就是根据控件的不同等级来切换Drawable,有点类似于selector中的根据控件的状态来更新Drawable。不同的是这里是根据控件的level来更新。比如下面一个简单的LevelListDrawable文件:


<?xml version="1.0" encoding="utf-8"?> 
<level-list xmlns:android="http://schemas.android.com/apk/res/android"> 
 <item 
  android:drawable="@drawable/p2" 
  android:maxLevel="10" 
  android:minLevel="0"/> 
 <item 
  android:drawable="@drawable/p1" 
  android:minLevel="11" 
  android:maxLevel="20"/> 
</level-list> 

这个levelListDrawable文件表示当控件的level处于0~10之间的时候,显示图片p2,当控件的level处于11~20之间的时候显示图片p1,我们来看看我的ImageView:


<ImageView 
  android:layout_width="200dp" 
  android:scaleType="centerCrop" 
  android:id="@+id/iv" 
  android:class="lazy" data-src="@drawable/level_list_drawable" 
  android:layout_height="200dp"/> 

在ImageView中将刚才的LevelListDrawable对象作为它的class="lazy" data-src,然后当我点击按钮的时候改变ImageView的level,这个时候图片就会发生变化。点击事件代码如下:


public void toggle(View view) { 
  if (flag) { 
   iv.setImageLevel(5); 
   flag = false; 
  }else{ 
   iv.setImageLevel(15); 
   flag = true; 
  } 
 } 

显示效果如下:


这里大家需要注意的是level的取值范围为0~10000,默认值为0。

6.TransitonDrawable
TransitionDrawable主要是实现两个Drawable之间淡入淡出的效果。我们来看看TransitionDrawable文件:


<?xml version="1.0" encoding="utf-8"?> 
<transition xmlns:android="http://schemas.android.com/apk/res/android"> 
 <item android:drawable="@drawable/p1"/> 
 <item android:drawable="@drawable/p2"/> 
</transition> 

再来看看ImageView文件:


<ImageView 
  android:layout_width="200dp" 
  android:scaleType="centerCrop" 
  android:id="@+id/iv" 
  android:class="lazy" data-src="@drawable/transition_drawable" 
  android:layout_height="200dp"/> 

点击事件如下:


public void toggle(View view) { 
  TransitionDrawable drawable = (TransitionDrawable) iv.getDrawable(); 
  drawable.startTransition(2000); 
 } 

显示效果如下 :


7.InsetDrawable
InsetDrawable表示可以将一个Drawable嵌入到自己当中。类似的效果使用LayerDrawable也能实现。来看看代码:


<?xml version="1.0" encoding="utf-8"?> 
<inset xmlns:android="http://schemas.android.com/apk/res/android" 
  android:insetBottom="20dp" 
  android:insetLeft="20dp" 
  android:insetRight="20dp" 
  android:insetTop="20dp"> 
 <shape android:shape="oval"> 
  <solid android:color="@color/colorAccent"/> 
 </shape> 
</inset> 

表示中心的圆形与控件的上下左右四边的间距都为20dp,当然这个设置图像的地方也可以像下面这种方式来写:


<?xml version="1.0" encoding="utf-8"?> 
<inset xmlns:android="http://schemas.android.com/apk/res/android" 
  android:insetBottom="20dp" 
  android:drawable="@drawable/p1" 
  android:insetLeft="20dp" 
  android:insetRight="20dp" 
  android:insetTop="20dp"> 
</inset> 

8.ClipDrawable
表示根据一个Drawable的level对Drawable进行剪裁,代码如下:


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

drawable表示drawable图像,clipOrientation表示剪裁的方向,是从水平方向剪裁还是从垂直方向剪裁,这个属性配合gravity属性才会生效,至于每次剪裁的百分比则是和level属性的值有关,level属性的取值范围为0~10000,0表示完全剪裁,10000表示完全不剪裁,5000则表示剪裁一般,其它值依此类推。

原文链接:http://blog.csdn.net/u012702547/article/details/51594131

您可能感兴趣的文章:Android编程之canvas绘制各种图形(点,直线,弧,圆,椭圆,文字,矩形,多边形,曲线,圆角矩形)Android ImageView绘制圆角效果Android Bitmap和Drawable相互转换的简单代码android中图形图像处理之drawable用法分析Android的ImageButton当显示Drawable图片时就不显示文字详解Android中Drawable方法关于Android中drawable必知的一些规则Android Drawable及其相关类的使用Android Drawable必备知识小结Android自定义Drawable实现圆形和圆角Android开发使用Drawable绘制圆角与圆形图案功能示例


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

玩转Android之Drawable的使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

玩转Android之Drawable的使用

Drawable天天用,可你是否对Drawable家族有一个完整的认知?今天我们就来系统的学习一下Drawable的使用。1.概述 用过Drawable的筒子都知道Drawable有很多种,有的时候Drawable是一张图片,有的时候Dra
2022-06-06

Android 玩转Glide4---进阶使用篇

前言 系列文章专栏: 玩转Glide4 基础使用篇:Android 玩转Glide4—基础使用篇 进阶使用篇:Android 玩转Glide4—进阶使用篇 Transformation篇:Android 玩转Glide4—Transform
2022-06-06

Android中drawable使用Shape资源

本文实例为大家分享了drawable使用Shape资源的具体内容,供大家参考,具体内容如下 1.画一条水平方向的虚线 2022-06-06

Android Drawable及其相关类的使用

一个让人赏心悦目的界面对软件来说非常重要,因此图形图像资源也显得非常重要。本讲就要谈一谈Android中处理图形图像的最重要的一个类Drawable。Drawable就是一个可以画的对象的抽象(有点别扭,你凑合看吧),下面是它的继承关系,可
2022-06-06

Android应用中怎么将Drawable转换成Bitmap

这篇文章将为大家详细讲解有关Android应用中怎么将Drawable转换成Bitmap,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、Bitmap转DrawableBitmap bm=x
2023-05-31

Android Bitmap和Drawable相互转换的简单代码

很多开发者表示,不知道Android的Drawable和Bitmap之间如何相关转换。下面Android123给大家两种比较简单高效的方法。一、Bitmap转Drawable 代码如下:  Bitmap bm=xxx; //xxx根据你的情
2022-06-06

玩转python爬虫之cookie使用方法

之前一篇文章我们学习了爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用。 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些
2022-06-04

android的drawable类如何应用

Android的Drawable类是用于绘制可拉伸、平铺或定制形状的图形资源。它可以用于按钮、背景、图标等各种UI元素。要应用Drawable类,可以按照以下步骤进行操作:1. 在res目录下的drawable文件夹中创建一个XML文件,用
2023-09-14

android中图形图像处理之drawable用法分析

本文实例讲述了android中图形图像处理之drawable用法。分享给大家供大家参考。具体如下: 一、如何获取 res 中的资源 数据包package:android.content.res 主要类:Resources 其主要接口按照功能
2022-06-06

android的drawable类有什么作用

Drawable类在Android中用于处理图片和其他绘图操作的基类。它提供了一种统一的接口,使开发者可以使用不同的图像资源,如位图、矢量图和动画,来进行绘制。Drawable类的主要作用包括:1. 显示图片:Drawable类可以加载各种
2023-09-26

Android App开发中将View或Drawable转为Bitmap的方法

View转换为Bitmap Android中经常会遇到把View转换为Bitmap的情形,比如,对整个屏幕视图进行截屏并生成图片;Coverflow中需要把一页一页的view转换为Bitmap、以便实现复杂的图形效果(阴影、倒影效果等);再
2022-06-06

怎么在Android中使用Drawable改变图片的颜色

今天就跟大家聊聊有关怎么在Android中使用Drawable改变图片的颜色,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.利用color资源对Drawable变色Drawable
2023-05-30

Java之使用POI教你玩转Excel导入与导出

这篇文章主要介绍了Java之使用POI教你玩转Excel导入与导出,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

玩转PostgreSQL之30个实用SQL语句

目录引言实用SQL语句一、数据库连接二、赋权操作三、数据库表或者索引四、获取数据大小五、数据库分析六、数据库备份总结引言PostgreSQL是一款功能非常强大的开源关系型数据库,它支持哈希索引、反向索引、部分索引、Expression 索
2022-11-18

Android入门之ViewFlipper翻转视图的使用详解

本篇给大家带了的是ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放!本篇我们我们会使用两个例子:一个自动播放首页轮播页一个手动可左右滑动道页的轮播页来说透这个组件的使用,感兴趣的可以了解一下
2022-11-21

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录