android中常见的Drawable资源有哪些?

Drawable资源是安卓应用中最常见的一种资源,比如图片等,因此,对于初学者而言,必须掌握drawable资源相关应用。
今天在网上刚好看到了一篇介绍android Drawable资源的文章,分享给大家,希望对大家开发android应用时,使用Drawable资源有所帮助吧。废话不多说,赶紧学起来吧。
Drawable是什么?
Drawable是一个抽象类(abstract class),它有好多子类(SubClass)来操作具体类型的资源,比如BitmapDrawable是用来操作位图,ColorDrawable用来操作颜色,ClipDrawable用来操作剪切板等。
在android开发中,Drawable资源一般存储在应用程序目录的\res\drawable目录下,当然依据分辨率的高低可以分别存储不同分辨率的资源到如下几个目录:
\res\drawable-ldpi
\res\drawable-mdpi
\res\drawable-hdpi
\res\drawable-xhdpi
图片资源
在android中,图片资源是简单的Drawable资源,目前Android支持的图片格式有:gif、png、jpg等。我们只需要把图片资源放置到\res\drawable目中,那么在编译后的R.java类中就会生成图片资源的资源ID。
我们在android编程中就可以通过调用相关的方法来获取图片资源(程序中如果要访问drawable_resource_file_name,那么可以如此:[packagename].R.drawable.drawable_resource_file_name)。
但这里需要注意的是,Android drawable资源的名称有约束,必须是: [a-z0-9_.](即:只能是字母数字及_和.),而且不能以数字开头,否则编译会报错 : Invalid file name: must contain only [a-z0-9_.]
下面通过一个代码,直观的演示如何访问一个图片资源(资源名称drawablefilename):
ImageView imageView=(ImageView)
findViewById(R.id.ImageView1);
imageView.setImageResource(
R.drawable.drawablefilename);
StateListDrawable资源
StateListDrawable内可以分配一组Drawable资源,StateListDrawable 被定义在一个XML文件中,以 <selector> 元素起始。其内部的每一个Drawable资源内嵌在 <item>元素中。
当StatListDrawable资源作为组件的背景或者前景Drawable资源时,可以随着组件状态的变更而自动切换相对应的资源 ,例如,一个Button可以处于不同的状态(按钮按下、获取焦点)。
我们可以使用一个StateListDrawable资源,来提供不同的背景图片对于每一个状态。当组件的状态变更时,会自定向下遍历StateListDrawable对应的xml文件来查找第一个匹配的Item。
下面我们通过一段代码片段,来向大家展示StateListDrawable资源的XML文件描述:
XML 文件存储在: res/drawable/button_statelist.xml :
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android=" http://www.maiziedu.com/course/android/">
<item android:state_pressed="true"
android:drawable="@drawable/button_pressed" />
<item android:state_focused="true"
android:drawable="@drawable/button_focused" />
<item android:state_hovered="true"
android:drawable="@drawable/button_focused" />
<item android:drawable="@drawable/button_normal"/>
</selector>
以下是Button的Layout文件:
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/button"
/>
当然我们也可以通过代码来设置Button的背景图片:
Button imageButton=(Button)
findViewById(R.id.imageButton);
imageButton.setBackgroundResource
(R.drawable.button_statelist);
ShapeDrawable资源
ShapeDrawable资源可以用于绘制一个特定的形状 ,比如矩形、椭圆等。如果你想自己动态的绘制二位图形,那么我们就可以使用ShapeDrawable资源对象,用ShapeDrawable,绘制我们所能想象的形状。
一个ShapeDrawable 需要一个Shape对象来管理呈现资源到UI Screen,如果没有Shape设置,那么会默认使用RectShape对象。
ShapeDrawable 被定义在一个XML文件中,以 <shape> 元素起始。其内部的每一个Drawable资源内嵌在 <item>元素中。
通过下面的代码片段,我们可以看看ShapeDrawable的XML定义:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android=" http://www.maiziedu.com/course/android/"
android:shape="oval">
<!-- 定义填充渐变颜色 -->
<gradient
android:startColor="#00f"
android:endColor="#00f"
android:angle="45"
android:type="sweep"/>
<!-- 设置内填充 -->
<padding android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp" />
<!-- 设置圆角矩形 -->
<corners android:radius="8dp" />
</shape>
我们可以用ShapeDrawable 来设置组件的背景色( setBackgroundDrawable()方法 ),如上的代码片段可设置一个TextEdit的背景色为蓝色的椭圆形状。当然我们也可以绘制自定义的View。
我们构建自定义形状的View时,由于ShapeDrawable 有其自己的draw()方法,可以构建一个View视图的子类,然后override View.onDraw()方法,如下代码片段是一个样例:
public class CustomDrawableView extends View {
private ShapeDrawable mDrawable;
public CustomDrawableView(Context context) {
super(context);
int x = 10;
int y = 10;
int width = 300;
int height = 50;
mDrawable = new ShapeDrawable(new OvalShape());
mDrawable.getPaint().setColor(0xff74AC23);
mDrawable.setBounds(x, y, x + width, y + height);
}
protected void onDraw(Canvas canvas) {
mDrawable.draw(canvas);
}
}
基于上述代码我们可以在我们的Activity中编程的构建自定义视图:
CustomDrawableView mCustomDrawableView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCustomDrawableView =
new CustomDrawableView(this);
setContentView(mCustomDrawableView);
}
当然我们也可以使用XML文件来描述:自定义的Drawable类必须重载view (Context, AttributeSet) 构造函数。接着我们添加Layout文件如下:
<com.example.shapedrawable.CustomDrawableViewandroid:layout_width="fill_parent"
android:layout_height="wrap_content"/>
ClipDrawable
ClipDrawable资源定义在一个XML中,表示裁剪(Clips)一个其他资源基于ClipDrawable资源的Level。你可以控制裁剪的Drawable的宽度高度及gravity属性,ClipDrawable常常被用来作为一个progressbars的实现。
以下样例是一个ClipDrawable资源:
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android=" http://www.maiziedu.com/course/android/"
android:drawable="@drawable/android"
android:clipOrientation="horizontal"
android:gravity="left"/>
下面的ImageView布局文件应用Clipdrawable资源:
<ImageViewandroid:id="@+id/image"
android:background="@drawable/clip"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
下面的代码获取drawable并且增加其裁剪,以便于渐增的显示图像
ImageView imageview = (ImageView)
findViewById(R.id.image);
ClipDrawable drawable = (ClipDrawable)
imageview.getDrawable();
drawable.setLevel(drawable.getLevel() + 1000);
当然我们可以使用一个Timer来实现图片的渐增显示。
但是这里需要注意的一点是,默认的Level值是0,表示图片被这个裁剪,故图片是不可见的。当值达到10000是代码裁剪为0,图片可以完全显示。
AnimationDrawable
AnimationDrawable通过定义一系列的Drawable对象构建一个基于帧的动画(frame-by-frame animations),可以被用来作为视图的背景色。
最简单的构建一个帧动画是在XML文件中构建一个动画,我们可以设定动画作为视图的背景色,通过调用AnimationDrawable.start()方法来运行动画。
如下代码片段是一个AnimationDrawable资源的XML文件,资源文件位置:res\drawable\spin_animation.xml
<animation-list
xmlns:android=" http://www.maiziedu.com/course/android/"android:oneshot="true">
<item
android:drawable="@drawable/rocket_thrust1"
android:duration="200" />
<item
android:drawable="@drawable/rocket_thrust2"
android:duration="200" />
<item
android:drawable="@drawable/rocket_thrust3"
android:duration="200" />
</animation-list>
我们可以看到,AnimationDrawable资源文件以 <animation-list>元素为根,包含一系列的<Item>节点,每一个节点定义了一个帧(frame)及持续时常。
上述动画运行了3个帧,通过设置<code>android:oneshot</code> 属性(attribute)为true,动画会循环一次并停留在最后一帧,如果为false那么会轮询(loop)的运行动画。
我们可以通过编码来加载播放动画:
ImageView img = (ImageView)
findViewById(R.id.spinning_wheel_image);
img.setBackgroundResource(
R.drawable.spin_animation);
AnimationDrawable frameAnimation =
(AnimationDrawable) img.getBackground();
frameAnimation.start();
但是需要提醒大家的是,AnimationDrawable. start()方法不能够在Activity的onCreate()方法中调用,因为AnimationDrawable还未完全的附加 (attached)到Window,如果你不需要交互而立即播放动画,那么可以在onWindowFocusChanged() 方法中,这个方法会在你的Activity Windows获取焦点是触发。
上面就是android应用中Drawable资源的相关介绍,由于篇幅问题,只介绍了几个比较常见的Drawable资源,还有一些Drawable子类为进行介绍,大家可以直接查看相关官方文档学习。
个人感觉上面的介绍还是很有用的,是android开发中比较常用到的一些操作,大家可以收藏,在以后需要用的时候,直接查阅。
相关文章:《Android开发工具常用快捷键大全》
android中常见的Drawable资源有哪些?的更多相关文章
- Android中常见的内存泄漏
为什么会产生内存泄漏? 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. ...
- Android 中常见控件的介绍和使用
1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...
- (转载)Android开发——Android中常见的4种线程池(保证你能看懂并理解)
0.前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用 ...
- Android开发——Android中常见的4种线程池(保证你能看懂并理解)
0.前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用 ...
- Android中常见的MVC模式
MVC模式的简要介绍 MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller). MVC模式的目的就是实现Web系统的职能分工. Model层实现系统中的业务 ...
- android中常见的设计模式有哪些?
建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常用的就是Dialog的构建,Notification的构建也是标准的建造者模式. 建造者模式很好理解,如果一个类的构造需要很 ...
- Android中常见功能包描述(转)
在Android中,各种包写成android.*的方式,重要包的描述如下所示:android.app :提供高层的程序模型.提供基本的运行环境android.content:包含各种的对设备上的数据进 ...
- Android中常见功能包描述
在Android中,各种包写成android.*的方式,重要包的描述如下所示:android.app :提供高层的程序模型.提供基本的运行环境android.content:包含各种的对设备上的数据进 ...
- android中常见的内存泄漏和解决的方法
android中的内存溢出预计大多数人在写代码的时候都出现过,事实上突然认为工作一年和工作三年的差别是什么呢.事实上干的工作或许都一样,产品汪看到的结果也都一样,那差别就是速度和质量了. 写在前面的一 ...
随机推荐
- android design 新控件
转载请标明出处: http://blog.csdn.net/forezp/article/details/51873137 本文出自方志朋的博客 最近在研究android 开发的新控件,包括drawe ...
- Webpack4 学习笔记五 图片解析、输出的文件划分目录
前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 webpack打包图片和划分文件路径 使用图片的方式 通过 new Image() 在 css中设置 background-imag ...
- Vue源码学习三 ———— Vue构造函数包装
Vue源码学习二 是对Vue的原型对象的包装,最后从Vue的出生文件导出了 Vue这个构造函数 来到 src/core/index.js 代码是: import Vue from './instanc ...
- socket传送二进制流的一些总结
第一次实质性的接触socket通信方面的工作,所以遇到的问题还真不少,写篇博客记录一下,提升下记忆. 需求是通过私有协议进行二进制数据的传输,必须保证数据包不能被丢失,所以选择tcp的socket进行 ...
- 什么是shell 是不是什么时候都可以使用shell
因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化.因此,Shell脚本只要"用心写"一次,即可应用到很多系统上.因此,之所以要使用Shell脚本是基于 ...
- Windows Server 2012 搭建DHCP及远程路由访问
1.1 基础环境信息 1.2 DHCP与远程访问服务器角色安装 1.服务器管理器—>仪表板—>添加角色和功能,出现添加角色和功能向导,点击下一步 2.选择安装类型为基于角色或基 ...
- python__系统 : socket_UDP相关
socket.socket() 可以创建一个套接字: from socket import * from threading import Thread udp_socket = None dest_ ...
- Hive的数据库和表
本文介绍一下Hive中的数据库(Database/Schema)和表(Table)的基础知识,由于篇幅原因,这里只是一些常用的.基础的. Hive的数据库和表 先看一张草图: Hive结构 从图上可以 ...
- Aizu:0009- Prime Number
Prime Number Time limit 1000 ms Memory limit 131072 kB Problem Description Write a program which rea ...
- 使用CSS3制作各种形状
CSS3的一个非常酷的特性是允许我们创建各种规则和不规则形状的图形,从而可以减少图片的使用.以前只能在Photoshop等图像编辑软件中制作的复杂图形现在使用CSS3就可以完成了.通过使用新的CSS属 ...