动画 (Animation) 资源类型详述 (1)

本文详细介绍了安卓开发中的动画资源,包括Tween动画和Frame动画的使用,以及颜色状态资源。Tween动画用于旋转、渐变、移动、缩放效果,而Frame动画则通过显示一系列图片创建动态效果。此外,还讲解了颜色状态列表如何根据控件状态改变颜色。动画资源保存在res/anim和res/drawable文件夹,颜色状态资源定义在res/color文件夹中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详细介绍程序资源的使用,格式和语法,包括

①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属性值,点击按钮的时候按钮的文本会变成红色。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值