类型及处理方式
- 原生资源,存在assets目录下
- R访问,res
颜色值:
#RGB
#ARGB(A代表透明度,0~f)
#RRGGBB
#AARRGGBB
dimens.xml 尺寸
<
dimen
name
=
“spacing”
>
8dp
</
dimen
>
bools.xml boolean常量
<
bool
name
=
"is_male"
>
true
</
bool
>
integer.xml 整型常量
<
integer
name
=
"my_size"
>
32
</
integer
>
Array : res/values/arrays.xml
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
< resources >
< array name = "plain_arr" >
< item > @color/c1 </ item >
< item > @color/c2 </ item >
< item > @color/c3 </ item >
< item > @color/c4 </ item >
</ array >
< string-array name = "string_arr" >
< item > @string/s1 </ item >
< item > @string/s2 </ item >
< item > @string/s3 </ item >
< item > @string/s4 </ item >
< resources >
< array name = "plain_arr" >
< item > @color/c1 </ item >
< item > @color/c2 </ item >
< item > @color/c3 </ item >
< item > @color/c4 </ item >
</ array >
< string-array name = "string_arr" >
< item > @string/s1 </ item >
< item > @string/s2 </ item >
< item > @string/s3 </ item >
< item > @string/s4 </ item >
</string-array>
< string-array name = "books" >
< item > Sharp Android </ item >
< item > Prime Android </ item >
< item > Bravo Android </ item >
< string-array name = "books" >
< item > Sharp Android </ item >
< item > Prime Android </ item >
< item > Bravo Android </ item >
</string-array>
</
resources
>
使用:
main.xml中
< ListView
...
android:entries = “@array/books "
< ListView
...
android:entries = “@array/books "
/>
main.java中:
texts = getResources().getStringArray(R.array.string_arr);
TypedArray
icons
= res.obtainTypedArray(R.array.plain_arr);
text.setBackgroundDrawable(icons.getDrawable(position));
StateListDrawable资源
用于组织多个Drawable对象
定义StateListDrawable对象的XML文件的根元素为<selector.../>,该元素可以包含多个<item.../元素>,可指定如下属性
- android:color/android:drawable
- android:state_xxx
< sector
xmlns:android = "http://schemas.android.com/apk/res/android" >
< item android:color = "hex_color"
android:state_pressed = [ " true "|" false "] />
</
sector
>
StateListDrawable的<item.../>元素所支持的状态有如下几种:
LayerDrawable
LayerDrawable也可以包含一个Drawable数组,系统会按照这些Drawable对象数组顺序来绘制他们,索引最大的位于最上面
xml跟元素为<layer-list.../>可包含:
- android:drawable
- android:id
- android:bottom|top|left|right
<?
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:drawabe = "@drawable/grow" />
< layer-list xmlns:android = "http://schemas.android.com/apk/res/android" >
< item android:id = "@android:id/background"
android:drawabe = "@drawable/grow" />
</
layer-list
>
ShapeDrawable 资源
用于定义一个基本的几何图形,XML文件的根元素是<shape.../>元素,该元素可指定如下属性:
android:shape
=
[
"
rectangle
”|”
oval
”|”
line
”|”
ring
"]
示例xml代码——my_shape_1.xml
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
< shape xmlns:android = "http://schemas.android.com/apk/res/android"
< shape xmlns:android = "http://schemas.android.com/apk/res/android"
android:shape="oval">
<!—-填充色-->
<
gradient
android:startColor = "#ff0"
android:endColor = "#00f"
android:angle = "45"
android:startColor = "#ff0"
android:endColor = "#00f"
android:angle = "45"
android:type="sweep"/>
<!--边框-->
<
padding
android:left = "7dp"
android:right = "7dp"
android:top = "7dp"
android:left = "7dp"
android:right = "7dp"
android:top = "7dp"
android:bottom="7dp"/>
<!—-边角-->
<corners android:radius="8dp"/>
</
shape
>
main.xml中调用shapeDrawable资源:
< TextView
android:id = "@+id/tv1"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "@string/hello_world"
< TextView
android:id = "@+id/tv1"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "@string/hello_world"
android:background="@drawable/my_shape_1" />
ClipDrawable资源
代表从其它位图上截取一个“图片片段”。在XML文件中定义ClipDrawable对象使用<clip.../>元素
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
< clip xmlns:android = "http://schemas.android.com/apk/res/android"
android:drawable = "@drawable/drawable_resource"
android:clipOrientation = [ " horizontal "|" vertical "]
android:gravity = [ " top "|" bottom "|" left "|" right "|" center_vertical "|" center_vertical "|
" fill_vertical "|" center_horizontal "|" fill_horizontal "|
< clip xmlns:android = "http://schemas.android.com/apk/res/android"
android:drawable = "@drawable/drawable_resource"
android:clipOrientation = [ " horizontal "|" vertical "]
android:gravity = [ " top "|" bottom "|" left "|" right "|" center_vertical "|" center_vertical "|
" fill_vertical "|" center_horizontal "|" fill_horizontal "|
"center"|"fill"|"clip_vertical"|"clip_horizontal"] />
三个属性分别代表:截取源Drawable对象;截取方向;截取对齐方式
使用ClipDrawable对象时可调用setLevel(int level)方法来设置截取区域大小,level值0~10000,空~整张
AnimationDrawable
支持逐帧动画和补间动画
以<set.../>元素作为根元素,可指定如下4个元素
- alpha 透明度
- scale 缩放改变
- translate 位移变换
- rotate 设置图片进行旋转
除具体值外,上述元素还可指定android:interpolator,用于指定动画的变化速度
linear-interpolator
accelerate_interpolator
decelerate_interpolator
若想让加速效果使用相同的动画速度,可指定:
android:shareInterpolator=“true"
示例代码:
my_anim.xml
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
< set android:interpolator = "@android:anim/linear_interpolator"
xmlns:android = "http://schemas.android.com/apk/res/android"
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 android:interpolator = "@android:anim/linear_interpolator"
xmlns:android = "http://schemas.android.com/apk/res/android"
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
>
acitivity_main.java
public
class
MainActivity
extends
ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. activity_main );
final ImageView image = (ImageView) findViewById(R.id. imageview );
final Animation anim = AnimationUtils.loadAnimation( this ,
R.anim. my_anim );
anim.setFillAfter( true );
Button bn = (Button) findViewById(R.id. bn );
bn.setOnClickListener( new OnClickListener()
{
@Override
public void onClick(View source)
{
image.startAnimation(anim);
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. activity_main );
final ImageView image = (ImageView) findViewById(R.id. imageview );
final Animation anim = AnimationUtils.loadAnimation( this ,
R.anim. my_anim );
anim.setFillAfter( true );
Button bn = (Button) findViewById(R.id. bn );
bn.setOnClickListener( new OnClickListener()
{
@Override
public void onClick(View source)
{
image.startAnimation(anim);
}
});
}
}
Property Animation资源
通常使用的是Animator的子类:
AnimatorSet、ValueAnimator、ObjectAnimator、TimeAnimator
<set…/>
|
AnimatorSet
|
<objectAnimator…/>
|
ObjectAnimator
|
<animator…/>
|
ValueAnimator
|
示例代码:
main.java
public
class
MainActivity
extends
ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. activity_main );
RelativeLayout container = (RelativeLayout)
findViewById(R.id. container );
container.addView( new MyAnimationView( this ));
}
public class MyAnimationView extends View
{
public MyAnimationView(Context context)
{
super (context);
ObjectAnimator colorAnim = (ObjectAnimator) AnimatorInflater
.loadAnimator(MainActivity. this , R.anim. color_anim );
colorAnim.setEvaluator( new ArgbEvaluator());
colorAnim.setTarget( this );
colorAnim.start();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. activity_main );
RelativeLayout container = (RelativeLayout)
findViewById(R.id. container );
container.addView( new MyAnimationView( this ));
}
public class MyAnimationView extends View
{
public MyAnimationView(Context context)
{
super (context);
ObjectAnimator colorAnim = (ObjectAnimator) AnimatorInflater
.loadAnimator(MainActivity. this , R.anim. color_anim );
colorAnim.setEvaluator( new ArgbEvaluator());
colorAnim.setTarget( this );
colorAnim.start();
}
}
}
使用原始XML资源
使用Layout资源
使用Menu资源
Style Theme
Android位于/res/values下,跟元素为<resource.../>,可包含多个<style.../>子元素,每个style定义一个样式
name
parent:继承的父样式
每个style可包含多个item
而主题,
- 不能作用于单个View组件
- 定义的格式是改变窗口外观的格式
如果只想要应用程序的某个Activity使用这个主题,只需要在manifest文件中,修改<activity.../>子元素,添加
android:theme=“@style/MyTheme"即可
主题同样支持继承,同样使用parenat=“@android:style/Theme.MyTheme”,继而覆盖部分想修改的属性
Attribute
<resource…/>
attr子元素
declare-styleable子元素(每个styleable对象就是一组attr属性的合集)
属性资源文件定义该属性之后,属性资源所定义的属性到底可以发挥什么作用,取决于自定义组件的代码实现
使用原始资源
/res/raw:android会自动管理该目录下的资源,通过R.raw.xxx来进行访问
/assets;通过AssetManager管理该目录下的原始资源
AssetManager提供的方法有:
InputStream open(String fileName)
AssetFileDescriptor openFd(String fileName)
示例代码如下:
public class MainActivity extends ActionBarActivity {
MediaPlayer mediaPlayer1 = null ;
MediaPlayer mediaPlayer2 = null ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. activity_main );
mediaPlayer1 = MediaPlayer.create( this , R.raw. bomb );
AssetManager am = getAssets();
try {
AssetFileDescriptor afd = am.openFd( "shot.mp3" );
mediaPlayer2 = new MediaPlayer();
mediaPlayer2 .setDataSource(afd.getFileDescriptor());
mediaPlayer2 .prepare();
} catch (IOException e) {
e.printStackTrace();
}
Button playRaw = (Button) findViewById(R.id. playRaw );
playRaw.setOnClickListener( new OnClickListener()
{
@Override
public void onClick(View source)
{
mediaPlayer1 .start();
}
});
Button playAsset = (Button) findViewById(R.id. playAsset );
playAsset.setOnClickListener( new OnClickListener()
{
@Override
public void onClick(View source)
{
mediaPlayer2 .start();
}
});
}
}
国际化和资源自适应
Android非常优秀的解耦合设计,方便了国际化的实现;实际应用在国际化的步骤上是非常简单的
资源自适应也是通过类似思路实现的
drawable-hdpi drawable-mdpi ...