摘要
在android开发过程中,经常会用到各种资源:字符串、颜色、样式、图片……经常会被这些资源搞得晕头转向,容易混淆,尤其是几种drawable类型的资源。下面对这些资源进行整理分类,让它们的格式和功能一目了然。
主体内容
Android的应用资源可以分为两大类:
- 可以通过R资源清单类访问的资源,保存在res目录下。
- 无法通过R资源清单类访问的原生资源,保存在assets目录下。
资源文件目录
一、res目录下的各种资源
1、res/values目录
不建议在同一分资源文件中定义各种值,势必增加程序的维护难度,最好使用不同的文件来存放不同类型的值。如下:
strings.xml(字符串资源,布尔资源bools.xml,整型资源integers.xml)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">资源Demo</string>
<string name="hello_world">Hello world!</string>
</resources>
colors.xml(颜色资源)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#ffffff</color>
<color name="black">#000000</color>
</resources>
dimens.xml(尺寸资源)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="content_font_size">20sp</dimen>
</resources>
arrays.xml(数组资源:普通类型数组array,字符串数组string-array,整型数组integer-array)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="color_array">
<item>@color/white</item>
<item>@color/black</item>
</array>
<string-array name="string_arr">
<item>@string/app_name</item>
<item>@string/hello_world</item>
</string-array>
</resources>
//Activity中使用普通数组
TypedArray colors = res.obtainTypedArray(R.array.color_array);
view.setBackgroundDrawable(colors.getDrawable(position));
//Activity中使用字符串、整型数组
string[] texts = getResources().getStringArray(R.array.string_arr);
styles.xml(样式资源,还有主题theme资源,定义格式通style一样,主题资源对整个应用中的Activity或指定的Activity起作用,而style可以用于单个View组件)
<?xml version="1.0" encoding="utf-8"?>
<!--自定义样式,可以继承-->
<resources>
<style name="style1">
<item name="android:textSize">18sp</item>
<item name="android:textColor">#ff0000</item>
</style>
<style name="style2" parent="style1">
<item name="android:background">#123430</item>
<item name="android:padding">8dp</item>
</style>
</resources>
2、res/drawable目录
Drawable资源是Android中使用最广泛的资源,也是最灵活的一种资源,可以直接使用.png、.jpg、.gif、.9.png等图片资源,还可以使用能被系统编译成Drawable子类的xml文件。Drawable资源通常保存在res/drawable目录,也可保存在res/drawable-ldpi、res/drawable-mdpi、res/drawable-hdpi、res/drawable-xhdpi目录下
图片Drawable资源
//直接放在drawable目录下,就会出现在R清单中
edit_font_color.xml(StateListDrawable资源,Drawable对象会根据目标组件的状态的改变而自动切换)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:color="@color/pink"/>
<item android:state_focused="false" android:color="@color/black"/>
</selector>
my_bar.xml(LayerDrawable资源,包含一个Drawable对象数组,系统按索引从小到大依次从下到上绘制这些Drawable)
<?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/grow"/>
<item android:id="@android:id/progress" android:drawable="@drawable/ok"/>
</layer-list>
用这个drawable定义一个拖动条
<SeekBar![这里写图片描述](https://img-blog.csdn.net/20151127162117022)
android:id="@+id/bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100"
android:progressDrawable="@drawable/my_bar"/>
效果如下
my_shape.xml(ShapeDrawable资源,定义基本的几何图形,可以用作定义几何边框)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--设置四个角的弧度-->
<corners
android:radius="5dp"/>
<!--设置内填充颜色-->
<solid android:color="#ffffff"/>
<!--设置边框-->
<stroke
android:width="1px"
android:color="@color/purple"/>
<!--设置内边距-->
<padding
android:bottom="5dp"
android:left="5dp"
android:right="5dp"
android:top="5dp"/>
</shape>
效果如下
my_clip.xml(ClipDrawable资源,从其他图片资源上截取一个片段,参数表示从哪里开始截取,截取方式。此Drawable有一个setLevel(int level)方法,0<= level<=10000,表示截取的区域,可以用Timer动态改变level值,达到徐徐张开得效果,也可以用ClipDrawable定义进度条)
<?xml version="1.0" encoding="utf-8"?>
<!--定义ClipDrawable资源,-->
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/shuangta"
android:gravity="center"
android:clipOrientation="horizontal">
</clip>
3、res/anim目录
my_anim.xml(AnimationDrawable资源,也是一种Drawable资源,代表一个动画,支持逐帧动画和补间动画,可以进行透明度、缩放、位移、旋转变换)
<?xml version="1.0" encoding="utf-8"?>
<!--定义AnimationDrawable资源,逐帧动画、补间动画(可以有透明度、缩放、位移、旋转变换)-->
<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="0.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"
android:fillAfter="true"/>
<!--定义位移变换-->
<translate android:fromXDelta="10"
android:toXDelta="130"
android:fromYDelta="30"
android:toYDelta="-80"
android:duration="2000"/>
<!--定义旋转变换-->
<rotate android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"/>
</set>
//Activity中使用AnimationDrawable资源
ImageView image = (ImageView)findViewById(R.id.image);
Animation anim = AnimationUtils.loadAnimation(this, R.anim.my_anim);
anim.setFillAfter(true);//保留动画结束状态
image.startAnimation(amin);
4、res/layout目录
存放Android的layout资源,这个从第一天学Android就开始用,此处就不赘述。
5、res/menu目录
后面补充
6、res/raw目录
存了以上资源之外,Android还需要用到其他资源,比如声音、视频等,但Android没有为其提供专门的支持,这种资源属于原始资源,可以放在res/raw或assets/目录下。res/raw目录下的资源会在R中生成索引,而assets下的资源不会
二、assets目录下的原生资源
上面已经介绍了assets,此处着重于assets目录下资源的使用。
//Activity中使用assert下的资源
AssetManager am = getAssets();
try{
AssetFileDescriptor afd = am.openFd("xuanyuanjian.mp3");
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(afd.getFileDescriptor());//加载资源文件
mediaPlayer2.prepare();
}catch(Exception e){
e.printStackTrace();
}
总结
各种资源使用示例代码已提交到github上,地址:https://github.com/zfisll/ResourcePack.git。介绍的都是一些常用的资源,还有些不常用的没有列出。本人刚写学习写blog,如果文章层次结构不当或者内容有误,还望积极指出,在此感谢大家的支持。