Android中App resources 主要包括:提供资源,访问资源,处理运行时的改变,本地化等内容。
1.Android中资源目录分布:
目录 资源类型
animator/ 存放属性动画
anim/ 存放补间动画
color 定义颜色
drawable Bitmap文件或者能够编译到,Bitmap文件,9patch,状态列表,动画图片等的XML文件
Layout 基本不见文件
Menu/ 定义Menu的,如可选Menu,上下文Menu,子Menu
raw 以原有形式保存的文件
values
- arrays.xml for resource arrays (typed arrays).
- color values
- dimension values.
- string values.
- styles.
一、提供可以替换的资源。
你可以通过提供不同的资源,然手机在运行时,根据当前的配置来获取相应的合适的资源。Android中支持多种配置标示符,这样用户可以,通过一个破折号区分标示符的方式,将多个修饰符添加到一个目录名上。
比如: mcc310
mcc310-mnc004
mcc208-mnc00
Android在选择过程中,先会选择mcc(mobile country code)然后再选择mnc.(mobile network code)。意思是:手机在根据SIM卡的信息,先匹配国家的代码,然后再去匹配网络提供商的代码。这样就可以精确的查找具体要使用的配置了。
其他的如:Layout Direction ldrtl布局从右到左
ldltr布局从左到右(17才加入的,这也是默认值)
再如smallestWidth可以获得的最小的宽度。 sw<N>dp如你可以获取的最小的宽度为600那么,你可以定义一个sw600dp,这样手机在查看配置的时候就会使用这一项。
这里内容较多,其他的查看文档中APP resources部分。android-sdk-windows/docs/guide/topics/resources/providing-resources.html#AlternativeResources
****注意:在给这些文件起名的时候必须严格的按照,文档中的对这些修饰符的顺序进行,否则是错误的。
2.提供最好的资源对设备的兼容。在设置了多种的配置后,应该为手机设置一种默认的配置。
二、访问资源
1.访问资源的两种形式:
1)在代码中R.string.hello。
访问格式:
[<package_name>.]R.<resource_type>.<resource_name>
2)在XML文件中。访问格式:@drawable/ic_launcher
2.引用风格属性。用户可以使用当前应用主题中的风格属性。格式为:?[包名(可选)][资源类型(可选)/]资源名。实例如下
<EditText id="text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="?android:textColorSecondary"
android:text="@string/hello_world" />
3
.访问Android平台资源:Android中包含了很多标准的资源,如风格,主题,布局。想要访问这些资源需要使用android这个包。
如:
setListAdapter
ArrayAdapter
三、处理运行是的改变。
Android中的一些设备配置能够在运行期间改变,如屏幕的朝向。当能够让Android重新运行Activity的改变发生的时候,Android会重新读取配置然后启动应用。这就使得你的应用程序能够自动的适应新的配置,使用新的配置重新加载你的应用,来满足新的设备配置。
为了能够正确的处理一个重启,根据Android的生命周期来保存数据就显得十分重要了。Android在销毁Activity之前会先调用onSaveInstanceState()方法将应用程序现在的状态进行保存。这样就可以在onCreate或者onRestoreInstanceState期间保存状态了。
如果你遇到重启你的应用并且要保存大量的数据的情况,这种情况是非常耗时并且给用户带来了不好的体验,在这种情况下你必须做一下两件事情。
1)在配置改变期间保持一个有状态的对象。
(1)重写onRetainNonConfigurationInstance()方法,返回你想要保持的对象。这个方法是在onStop和onDestory这两个回调函数之间调用。
(2)当你的活动重新创建时调用getLastNonConfigurationInstance()覆盖你的对象。
实例
@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
if (data == null) {
data = loadMyData();
}
...
}
2)自己处理配置的改变。阻止系统重启你的Activity,使用一个回调函数处理配置的改变,这样你就可以手动的更新你的Activity了。
以屏幕改变为例:
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
上述中的Configuration方法表示的当前所有的配置,而不仅仅是当前发生的配置。Android3.2以上Android:configChange="orientation|screenSize"必须这种来处理屏幕切换。
四、本地化资源。该部分省略。
五、资源类型
1.动画资源。两种类型的动画资源。
1)属性动画(Property)。通过改变在一段时间内使用Animator改变对象的属性值来创建动画。
就是在一段时间内修改对象的如:背景颜色,透明度。res/animtor/**.xml
使用的对象,ValueAnimator,ObjectAnimator和AnimatorSet等。
使用方式:
In Java: R.animator.filename
In XML: @[package:]animator/filename
基本语法:
<set
android:ordering=["together" | "sequentially"]>
//对一个具体属性在一段时间上设定动画
<objectAnimator
android:propertyName="string"
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
//在特定的时间段上执行动画
<animator
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<set>
...
</set>
</set>
2)视图动画(View)。其分为两类。res/anim/***.xml
(1)补间动画(Tween)。通过在一张图片上使用Animation,执行一系列的变换。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
表示ScaleAnimator
<scale
android:fromXScale="float"
//图片从多大变大多大
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
//表示图片以那个点为基准点android:pivotX="float" android:pivotY="float" />在水平或者竖直方向上的移动。如果值为-100 到 100 %p表示相对于父窗口。如果没有%p表示是绝对位置移动表示一个TranslationAnimation <translate android:fromXDelta="float" android:toXDelta="float" android:fromYDelta="float" android:toYDelta="float" />
表示RotationAnimation,动画的旋转pivotX表示旋转的基准点。fromDegree是旋转的角度
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
Interpolators:插值。是一个定义在xml文件中的动画修改器,影响了动画的改变率。
android:interpolator
可以这样使用该元素。
Interpolator class | Resource ID |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<set android:interpolator="@android:anim/accelerate_interpolator">
...
</set>
(2)帧动画(Frame)。使用AnimatorDrawable来展示一系列的图片创建该动画。
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<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 rocketAnimation;
public void shit(View v)
{
ImageView rocketImage = (ImageView) findViewById(R.id.iv);
rocketImage.setBackgroundResource(R.anim.rocket);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
}