详细介绍程序资源的使用,格式和语法,包括
①Animation Resources
动画资源,Tween动画(Tween动画是操作某个控件让其展现出旋转、渐变、移动、缩放的过程)保存在res/anim资源文件中,Frame动画保存在res/drawable资源文件中。
②颜色状态资源
定义在res/color/文件夹中。
③Drawable资源
定义在res/drawable/文件夹中。
④布局资源
定义在res/layout/文件夹中。
⑤菜单资源
定义在res/menu/文件夹中。
⑥字符串资源
可以定义字符串,字符串数组,和plurals (一种可以像printf函数那样进行格式化输出的字符串),保存在res/values/文件夹中,分别通过R.string, R.array, R.plurals进行访问。
⑦样式资源
定义界面的外观和格式,保存在res/values/文件夹中,使用R.style进行访问。
⑧字体资源
保存在res/font/文件夹中,使用R.font进行访问。
⑨其它资源
Bool, Color, Dimension, ID, Integer, Integer Array, Typed Array.
1.Animation
Animation有两种:Property Animation通过Animator类在一段时间内修改对象的属性来创建动画。
View Animation分为两种,Tween animation 通过Animation函数在一个图像上进行变换 (平移、缩放)操作来创建动画,Frame animation 通过AnimationDrawable类有序地显示一系列的图片来创建动画。
Property animation保存在res/animator文件夹中,
语法规则:
<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>
<set>表示集合,集合可以包括代表对象的<objectAnimator>和包括数值的<valueAnimator>,也可以包括集合自己,可以对相关的属性进行设置。比如set有个属性ordering有可以填写两个数值,together表示所有的animator同时执行,sequentially表示按照布局文件先后执行。
可以写个xml文件实际感受到这些属性的作
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:propertyName="y"
android:duration="750"
android:valueFrom="200"
android:valueTo="700"
android:repeatCount="1"
android:repeatMode="reverse"
/>
<objectAnimator
android:propertyName="alpha"
android:duration="750"
android:valueFrom="1.0"
android:valueTo="0"
android:repeatCount="1"
android:repeatMode="reverse"
/>
</set>
源码在appresources目录里面。
先建立一个对象,这个对象包括很多属性,比如alpha,位置坐标,颜色,形状等。
通过Animator就可以动态地改变这些属性值显示不同的效果。
点击按钮,四个球开始运动,第一个球按照模拟物体落地,使用BoundInterpolator,官方定义大概十个插补器,需要具体的操作才能知道效果。
AccelerateDecelerateInterpolator, AccelerateInterpolator, AnticipateInterpolator, BounceInterpolator
等,可以修改代码进行实践。
/**
* pvhY = PropertyValuesHolder.ofFloat("y", ball.getY(),
* getHeight() - BALL_SIZE);
* PropertyValuesHolder pvhAlpha = PropertyValuesHolder.ofFloat("alpha", 1.0f, 0f);
* ObjectAnimator yAlphaBouncer = ObjectAnimator.ofPropertyValuesHolder(ball,
* pvhY, pvhAlpha).setDuration(DURATION/2);
* yAlphaBouncer.setInterpolator(new AccelerateInterpolator());
* yAlphaBouncer.setRepeatCount(1);
* yAlphaBouncer.setRepeatMode(ValueAnimator.REVERSE);
*
*/
set = (AnimatorSet) AnimatorInflater.loadAnimator(
PropertyAnimation.this, R.animator.ball_y_alpha);
set.setTarget(ball);
ball = balls.get(2);
PropertyValuesHolder pvhW = PropertyValuesHolder.ofFloat("width", ball.getWidth(),
ball.getWidth() * 2);
PropertyValuesHolder pvhH = PropertyValuesHolder.ofFloat("height", ball.getHeight(),
ball.getHeight() * 2);
PropertyValuesHolder pvTX = PropertyValuesHolder.ofFloat("x", ball.getX(),
ball.getX() - BALL_SIZE / 2f);
PropertyValuesHolder pvTY = PropertyValuesHolder.ofFloat("y", ball.getY(),
ball.getY() - BALL_SIZE / 2f);
ObjectAnimator whxyBouncer = ObjectAnimator.ofPropertyValuesHolder(ball, pvhW, pvhH,
pvTX, pvTY).setDuration(DURATION / 2);
whxyBouncer.setRepeatCount(1);
whxyBouncer.setRepeatMode(ValueAnimator.REVERSE);
用代码写这些动态的效果很麻烦,所以推荐使用xml文件定义,简单直观。
Frame animation是预制一组连贯的图片,本例中使用的是桃心,连续加载不同刻度的桃心显示动态的效果。
public class FrameAnimation extends Activity {
ConstraintLayout layout;
ImageView heartImage;
AnimationDrawable heartAnimation;
// 控制动画的运行和停止。
boolean toggle;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.button);
layout = findViewById(R.id.container);
layout.setBackgroundColor(getColor(R.color.cyan));
heartImage = new ImageView(this);
heartImage.setBackground(getDrawable(R.drawable.ic_heart));
heartAnimation = (AnimationDrawable) heartImage.getBackground();
toggle = true;
layout.addView(heartImage);
}
public void sendMessage(View view) {
toggle ^= true;
heartAnimation.start();
if (heartAnimation.isRunning() && toggle) {
heartAnimation.stop();
}
}
}
最后是Tween animation,通过旋转,缩放,拉伸等形式改变图片的显示,参考源码可以看到指南针变形的动画。
xml文件存放在res/anim/文件夹下面。
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
<set
android:interpolator="@android:anim/accelerate_interpolator"
android:startOffset="700">
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
</set>
2.Color state list
根据不同的状态显示不同的颜色值,定义个按钮,让它的文本根据不同的状态颜色发生变化。
xml文件存放在res/color/目录下面。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:color="#ffff0000" /> <!-- pressed -->
<item android:state_focused="true"
android:color="#ff0000ff" /> <!-- focused -->
<item android:color="#00ffff" /> <!-- default -->
</selector>
设置textColor属性值,点击按钮的时候按钮的文本会变成红色。