Java刚開始学习的人直接在Java源代码使用"hello" 和123 类型的字符串和整型。但时间长了就会忘记当初定义的原因,有经验的或许会定义字符串常量ResultSet.TYPE_FORWARD_ONLY,有经验的一看就知道其原因。这样的写法已经减少了耦合性,Android则对这些字符串常量、数值常量进行进一步的改进:把用到的各种资源字符串常量、颜色资源、数组资源、菜单资源都集中放到res文件夹下。应用程序则直接使用这些资源中定义的值。

资源类型及存储方式

Android应用资源可分为两大类:

1.无法通过R清单类訪问的原生资源。保存在assets文件夹下

2.可通过R资源清单类訪问的资源,保存在res文件夹下

资源存储:

/res/animator
存放定义属性动画的XML文件

/res/anim
定义补间动画的XML文件

/res/color
存放定义不同颜色下颜色列表的XML文件

/res/drawable
存放位图(png,jpg,gif)和Drawable对象(BItmapDrawable,NinePatchDrawable,StateListDrawable,AnimationDrawable,Drawable)

/res/layout
存放各种用户界面的布局文件

/res/menu
存放为应用程序定义的各种菜单的资源,包含选项菜单,子菜单,上下文菜单资源

/res/raw 存放随意类型的原生资源(比如音频,视频等)在Java代码中调用Resource对象的openRawResource(int id)方法获取该资源二进制输入流。

/res/values 
存放简单值的XML文件,包含字符串、数组、整数、颜色等。都存放在<resources></resources>节点下。建议不同类型存放在不同XML文件里。

使用方式:

Java代码中

<package_name>.R.<resource_type>.<resouece_name>

比如:android.R.layout.simple_expandable_list_item_1  引用Java程序所在的R类的包,包名能够省略

事实上上述写法并非引用真正的资源对象。而是Andoird应用的API同意直接使用int类型的资源清单项取代应用资源。获取实际资源能够借助Resource类(Android资源訪问总管家)。Resource主要提供两类方法:

getXxx(int id):依据自愿清单ID来获取实际资源

getAssets() :获取訪问/assets/文件夹下资源的AssetManager对象

Resource由Context调用getResource()方法来获取

		//获取Resource
Resources res = getResources();
//获取字符串资源
String mainTitile = res.getText(R.string.main_titile);
//获取Drawable资源
res.getDrawable(R.drawable.ic_launcher);
//获取数组资源
int [] arr = res.getIntArray(R.array.books);

XML中

<resources>
<color name="red">#ff00</color>
<string name="hello">Hello</string>
</resources>

控件引用

    <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/red">
</TextView>

array资源

	<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/test"></ListView>
<resources>
<string-array name="test">
<item>1</item>
<item>2</item>
<item>3</item>
<item>@string/hello_world</item>
</string-array>

上面代码能够看出资源之前能够相互引用。

StateListDrawable资源

StateListDrawable用于组织多个Drawable对象。当使用StateListDrawable作为目标组件的背景。前景图片时,StateListDrawable对象多显示的Drawable对象会随目标组件状态的改变而自己主动切换。

定义StateListDrawable对象的XML文件的根元素为<selector..../> 该元素能够包括多个<item..../>能够指定

android:color或android:drawable指定颜色或Drawable对象。

android:state_xxx:指定一个特定状态(active、checked、last、pressed等)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="德玛西亚"
android:textColor="@drawable/my_color" >
</EditText>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="盖伦"
android:textColor="@drawable/my_color" >
</EditText>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?

>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 获取焦点时的颜色 -->
<item android:state_focused="true" android:color="#f44"></item>
<!-- 失去焦点时颜色 -->
<item android:state_focused="false" android:color="#455"></item>
</selector>

LayerDrawable资源

与StateListDrawable有点类似。LayerDrawable也可包括一个Drawable数组,因此系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会被绘制在最上面。

定义LayerDrawable对象的XML文件的根元素为<layer-list...../>,该元素能够包括多个<item..../>元素,能够指定例如以下属性:

android:drawable:指定作为LayerDrawable元素之中的一个的Drawable对象

android:id为该Drawable对象指定唯一标识

android:buttom|top|button:它们用于指定一个长度值。用于指定将该Drawable对象绘制到目标组件的指定位置。

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <SeekBar
android:id="@+id/bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progressDrawable="@drawable/my_bar"/> <ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/layout_logo"/> </LinearLayout>

my_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 定义轨道背景 -->
<item android:id="@android:id/background" android:drawable="@drawable/ic_launcher"></item>
<item android:id="@android:id/progress" android:drawable="@drawable/b"></item> </layer-list>

layout_logo.xml

<?

xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<bitmap
android:gravity="center"
android:src="@drawable/ic_launcher" />
</item> <item android:top="25dp" android:left="25dp">
<bitmap
android:gravity="center"
android:src="@drawable/ic_launcher" />
</item> <item android:top="50dp" android:left="50dp">
<bitmap
android:gravity="center"
android:src="@drawable/ic_launcher" />
</item>
</layer-list>

效果图:

上述代码能够看出ImageView的src能够指定图片。还能够是layer(图层),图层item中定义每一个显示的Bitmap图片和所在的位置<bitmap android:gravity="center" >这里所说的居中是相对于ImageView空间容器大小的居中。

SharpDrawable资源

之前UI简单美化提过,这个就不说了

ClipDrawable资源

ClipDrawable代表从其它的位图上截取一个"图片片段",在XML文件里定义ClipDrawable对象使用<clip....../>元素,语法为:

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_launcher"
android:clipOrientation="horizontal|vertical"
android:gravity="top|bottom|right"> </clip>

使用ClipDrawable对象时可调用setLevel(int level) 方法来设置截取的大小,0截取的图片为空。10000时,截取整张图片

利用level慢慢展开的风景,当点击图片时自己主动所有显示

public class MainActivity extends Activity {
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); img = (ImageView) findViewById(R.id.img);
//获取图片所显示的ClipDrawable对象
final ClipDrawable drawable = (ClipDrawable) img.getDrawable();
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==0x123){
//改动ClipDrawable的level的值
drawable.setLevel(drawable.getLevel()+20);
}
}
};
final Timer timer = new Timer();
timer.schedule(new TimerTask() { @Override
public void run() {
Message msg = new Message();
msg.what=0x123;
//发送消息通知应用改动ClipDrawable对象的level的值
handler.sendMessage(msg);
if(drawable.getLevel()>=10000){
timer.cancel();
}
}
}, 0, 300);
img.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
drawable.setLevel(10000);
}
});
}
}

上面代码事实上就是时刻的在改变裁减之后的值在显示形成的徐徐展开效果。

AnimationDrawable资源

AnimationDrawable代表一个动画,支持帧动画和补间动画。

定义补间动画的XML资源文件以<set..../>元素作为根元素。该元素能够指定a:lpha透明度、scale缩放、translate位移、ratate旋转。动画存放路径res/animi。ADT创建android应用时不带有该路径,须要手动创建。

MainActivity.java

public class MainActivity extends Activity {
ImageView imageView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); imageView1=(ImageView) findViewById(R.id.imageView1);
//载入动画资源
final Animation animation = AnimationUtils.loadAnimation(this, R.anim.set_test);
//设置动画结束后保留结束状态
animation.setFillAfter(true);
Button bn = (Button) findViewById(R.id.bn);
bn.setText("開始动画");
bn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
//開始动画
imageView1.startAnimation(animation);
}
}); }
}

set_test.xml

<?

xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:duration="5000">
<!-- 定义缩放变换 -->
<scale android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="true"
android:duration="2000"/>
<!-- 定义位移变换 -->
<translate
android:fromXDelta="10"
android:toXDelta="130"
android:fromYDelta="30"
android:toYDelta="-80"
android:duration="2000"/>
</set>

Property Animation资源

Animation代表一个属性动画。但它仅仅是一个抽象类,一般会使用它的子类:AnimatorSet、ValueAnimator、ObjectAnimator、TimeAnimator。

须要animator文件夹。创建项目的时候没有。手动创建。

定义属性动画XML资源能以三个元素中的随意一个作为根元素

<set...../> 它是一个父元素,用于包括其它<objectAnimator>或者<set.../>子元素。该属性定义的资源代表AnimatorSet对象

<objectAnimator.../>用于定义ObjectAnimtor动画

<animator.../>  用于定义ValueAnimator动画

背景颜色一直变化的Demo

public class MainActivity extends Activity {
ImageView imageView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); LinearLayout l = (LinearLayout)findViewById(R.id.container);
l.addView(new MyAnimtionView(this)); }
public class MyAnimtionView extends View{ public MyAnimtionView(Context context) {
super(context);
//载入动画资源
ObjectAnimator colorAnim = (ObjectAnimator) AnimatorInflater.loadAnimator(context, R.animator.object_test);
colorAnim.setEvaluator(new ArgbEvaluator());
//对该View本身应用属性动画
colorAnim.setTarget(this);
//開始动画
colorAnim.start();
} }
}

res/animator/object_test.xml

<?

xml version="1.0" encoding="utf-8"?

>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="backgroundColor"
android:duration="3000"
android:valueFrom="#FF8080"
android:valueTo="#8080FF"
android:valueType="intType"
android:repeatCount="infinite"
android:repeatMode="reverse"
>
</objectAnimator>

总结:

资源名 文件夹
根节点

StateListDrawable    Drawable <selector..../>

LayerDrawable Drawable   <layer-list..../>

Property Animation animator <objectAnimator.../>

SharpDrawable Drawable  <shape...../>

AnimationDrawable  anim   <set..../>

Android应用资源的更多相关文章

  1. Android xml资源文件中@、@android:type、@*、?、@+含义和区别

    一.@代表引用资源 1.引用自定义资源.格式:@[package:]type/name android:text="@string/hello" 2.引用系统资源.格式:@andr ...

  2. android 学习资源总结

    http://android-arsenal.com/free   国外的android分类资源网站 http://www.ibm.com/developerworks/cn/topics/   IB ...

  3. Android开发者资源大汇总

    本文总结了最新的Android开发资源.下面列出的资源都是常用的,每个Android程序员都应该知道,能大大方便App开发.Enjoy~ 来源:Android开发周刊 中文的Android开发信息,资 ...

  4. 34.Android之资源文件res里drawable学习

    我们经常看到android工程资源文件res下drawable如ldpi.mdpi.hdpi.xhdpi.xxhdpi文件,今天我们学习了解下. (1)drawable-hdpi里面存放高分辨率的图片 ...

  5. Android优秀资源整理合集(论菜鸟到高级攻城狮)

    转载请注明转自:http://blog.csdn.net/u011176685/article/details/51434702 csdn文章:Android优秀资源整理合集(论菜鸟到高级攻城狮) 时 ...

  6. Android应用资源--之属性(Attribute)资源

    原文链接: http://wujiandong.iteye.com/blog/1184921 属性(Attribute)资源:属于整个Android应用资源的一部分.其实就是网上一堆介绍怎么给自定义V ...

  7. Android应用资源的分类和存储

    Android应用资源可以分为两大类1.无法直接访问的原生资源,保存在asset目录下2.可通过R资源清单类访问的资源,保存在res目录下 Android应用资源的存储/res/anim:存放定义补间 ...

  8. Android 之 资源文件的介绍及使用

    Android 之 资源文件的介绍及使用 1.资源的简单介绍:  在res文件夹中定义:字符串.颜色.数组.菜单.图片.视频等:在应用程序中使用这些资源.  2.使用资源的长处:降低代码量,同一时候为 ...

  9. Android 学习资源[转]

    因为一些大家都知道的原因,android很多官方出品的优秀开发资源在国内无法访问. 国内的同行们对此也做出了很多努力,有很多朋友通过各种手段把很多优秀的资源搬运到了国内,为国内android开发者提供 ...

  10. Android values资源的定义

    Android values资源是Xml格式的文件 上图定义了颜色(colors)字符串(strings)样式(style)三个资源文件 xml文件写在resources标签里 <?xml ve ...

随机推荐

  1. 关于vue构建项目的一些指令

    第一步: brew install nodejs(MAC机子下)  Windows直接官网下载对应版本node.js 第二步: 获取nodejs模块安装目录访问权限(Windows系统忽略)sudo ...

  2. clipboard.min.js 复制表格内容

    <script type="text/javascript" src="js/clipboard.min.js"></script> & ...

  3. C_动态库|静态库

    动态库 动态链接库简称DLL,同时以.dll 为后缀,主要用于提供代码和数据 dll 并不是所有数据都能被访问到,必须要进行导出 动态链接库在内存中始终只保存了一份数据,起到了节约内存的作用 生成动态 ...

  4. 安卓app测试之内存监控

    一.通过Dumpsys 来取值 1.adb shell dumpsys meminfo 获取的所有进程的内存信息,以及总内存,剩余内存,使用的内存等信息. 2.想获得某一进程内存的详细信息,在后面加上 ...

  5. 微服务网关从零搭建——(二)搭建api网关(不带验证)

    环境准备 创建空的core2.1 api项目  演示使用名称APIGateWay  过程参考上一篇 完成后在appsettings.json 添加节点 "Setting": { & ...

  6. 面向对象程序设计--Java语言第三周编程题:查找里程

    查找里程 题目内容: 下图为国内主要城市之间的公路里程: 你的程序要读入这样的一张表,然后,根据输入的两个城市的名称,给出这两个城市之间的里程. 注意:任何两个城市之间的里程都已经给出,不需要计算经第 ...

  7. 11servlet接口

    11.servlet接口-2018/07/23 1.servlet 是一个接口,需要导包javax.servlet.Servlet; 第一种编写一个servlet程序的方法 写一个Java类,实现se ...

  8. 木块问题(The Blocks Problem,Uva 101)

    不定长数组:vector vector就是一个不定长数组.不仅如此,它把一些常用操作“封装”在了vector类型内部. 例如,若a是一个vector,可以用a.size( )读取它的大小,a.resi ...

  9. eclipse自动换行

    Eclipse是一款非常优秀的IDE,但是不能自动换行,需要安装一个插件完成这个功能. 安装办法有两种: 1.在线安装. 选择help-->install new software,点击Add, ...

  10. 电商架构设计-通过系统和业务拆分,遵循单一职责原则SRP,保障整个系统的可用性和稳定性

    个人观察 1.通过系统和业务拆分,遵循单一职责原则SRP,保障整个系统的可用性和稳定性. 2.单一职责原则SRP,真的很关键,广大程序员需要不断深入理解这个原则. 3.架构图是架构师的重要输出,通过图 ...