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

AccelerateDecelerateInterpolator

@android:anim/accelerate_decelerate_interpolator

AccelerateInterpolator

@android:anim/accelerate_interpolator

AnticipateInterpolator

@android:anim/anticipate_interpolator

AnticipateOvershootInterpolator

@android:anim/anticipate_overshoot_interpolator

BounceInterpolator

@android:anim/bounce_interpolator

CycleInterpolator

@android:anim/cycle_interpolator

DecelerateInterpolator

@android:anim/decelerate_interpolator

LinearInterpolator

@android:anim/linear_interpolator

OvershootInterpolator

@android:anim/overshoot_interpolator

<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();
}