欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

帧动画、视图动画、属性动画

程序员文章站 2022-03-25 18:48:19
...

//通过 AnimationDrawable类定义帧动画,先在布局文件drawable建立一个animation-list文件
//    XML文件存放在工程中res/drawable/目录下。XML文件的指令(即属性)为动画播放的顺序和时间间隔。
//    在XML文件中<animation-list>元素为根节点,<item>节点定义了每一帧,表示一个drawable资源的帧和帧间隔。
//AnimationDrawable 有两个方法,start和stop。
//主布局文件里用 View 控件来显示图片,再去调用方法获取图片给AnimationDrawable的对象使用。

public class FrameAnimationActivity extends AppCompatActivity {

    //AnimationDrawable是实现Drawable animations的基本类
    private AnimationDrawable animationDrawable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_frame_animation);

        View view = findViewById(R.id.view);
        //通过主xml的view获取图片,    public Drawable getBackground(){}
        //android:background="@drawable/loading"  在view里面添加,说明背景图片的来源,指向loading.xml
        animationDrawable = (AnimationDrawable) view.getBackground();//再强制转换
        //此方法来设置图片播放次数,true为一次,false为循环
        //android:oneshot=" true/false"  在loading中可设置产生同样效果
        animationDrawable.setOneShot(true);
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btnStart:
                animationDrawable.start();
                break;
            case R.id.btnStop:
                animationDrawable.stop();
                break;
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:drawable="@drawable/abc_vector_test"
        android:duration="100" />
    <item
        android:drawable="@drawable/ic_launcher_round"
        android:duration="100" />
    <item
        android:drawable="@drawable/ic_launcher"
        android:duration="100" />
</animation-list>
/视图动画:在res建一个anim包,做XML资源文件;定义一个Animation类对象,调用AnimationUtils.loadAnimation类方法
//         ,加载在资源文件中定义的动画资源Xxx.xml ,用参数View去启动各种动画操作。
//*在drawable资源文件加一个<shape>格式文件做图用,shape可以画四种图形,分别是:矩形(rectangle)、椭圆(oval)、线(line)、圆环(ring)
//                       <strok/>  android:width:边框大小  android:color:边框颜色     <solid:填充颜色>
//*加一个菜单做刷新功能,在drawable加一个vector文件为图标资源,加一个menu做一个菜单页.xml,用到icon、title、showAsAction、id
//                   重写onCreateOptionsMenu加载菜单,重写onOptionsItemSelected点击按钮触发重建
//透明度 Alpha  均写为TextView视图
//缩放 scale  android:fillAfter="true"  操作后固定图片; android:pivotX="50%"  操作的基准点
//位移 translate   android:toXDelta=“100%”,表示自身的100%,也就是从View自己的位置开始。
//                 android:toXDelta=“80%p”,表示父层View的80%,是以它父层View为参照的。
//                 android:repeatCount="1" 重复次数 infinite(无限)
//                 android:repeatMode="" 重复方式:reverse原路返回;restart重新开始。
//                 android:duration="300" 动画播放速度,适用于各种情况。
//旋转 rotate
//集合 set  android:startOffset="1000"  开始前等待时间
//插值器 interpolator 变化运动播放速率 ,添加view视图,分别实例化取id,两个Animation类对象分别进行不同插值器操作
//                   ,分别调用两种速度类型,LinearInterpolator匀速,AccelerateInterpolator设定的速度函数。

public class ViewAnimationActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_animation);
    }

    @Override//加载菜单
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.renew, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override//点击按钮触发重建
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.renew:
                recreate();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.viewAlphaAnimation:
                //加载在资源文件中定义的动画资源 alpha.xml
                Animation alpha = AnimationUtils.loadAnimation(this, R.anim.alpha);
                //将TextView和动画文件联系起来启动透明度动画
                view.startAnimation(alpha);
                break;
            case R.id.viewScaleAnimation:
                Animation scale = AnimationUtils.loadAnimation(this, R.anim.scale);
                view.startAnimation(scale);
                break;
            case R.id.viewTranslateAnimation:
                Animation translate = AnimationUtils.loadAnimation(this, R.anim.translate);
                view.startAnimation(translate);
                break;
            case R.id.viewRotateAnimation:
                Animation rotate = AnimationUtils.loadAnimation(this, R.anim.rotate);
                view.startAnimation(rotate);
                break;
            case R.id.viewSetAnimation:
                Animation set = AnimationUtils.loadAnimation(this, R.anim.set);
                view.startAnimation(set);
                break;
            case R.id.viewLinear:
            case R.id.viewAccelerate:
                //实例化两个view对象,因为要同时实现两种播放动画
                View viewLinear = findViewById(R.id.viewLinear);
                View viewAccelerate = findViewById(R.id.viewAccelerate);
                //在translate.xml里面把播放次数取消了
                Animation animationLinear = AnimationUtils.loadAnimation(this, R.anim.translate);
                Animation animationAccelerate = AnimationUtils.loadAnimation(this, R.anim.translate);
                //分别调用两种速度类型
                animationLinear.setInterpolator(new LinearInterpolator());
                animationAccelerate.setInterpolator(new AccelerateInterpolator());
                //将View和动画文件联系起来启动动画
                viewLinear.startAnimation(animationLinear);
                viewAccelerate.startAnimation(animationAccelerate);

                break;
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_view_animation"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="16dp"
    android:paddingTop="16dp"
    android:paddingRight="16dp"
    android:paddingBottom="16dp"
    tools:context="ViewAnimationActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <View
            android:id="@+id/viewAccelerate"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_margin="8dp"
            android:background="@color/colorPrimary"
            android:onClick="onClick" />

        <View
            android:id="@+id/viewLinear"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_margin="8dp"
            android:alpha="0.5"
            android:background="@color/colorPrimary"
            android:onClick="onClick" />

        <TextView
            android:id="@+id/viewAlphaAnimation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="Alpha" />

        <TextView
            android:id="@+id/viewScaleAnimation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:onClick="onClick"
            android:text="Scale" />

        <TextView
            android:id="@+id/viewTranslateAnimation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="Translate" />

        <TextView
            android:id="@+id/viewRotateAnimation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:onClick="onClick"
            android:text="Rotate" />

        <TextView
            android:id="@+id/viewSetAnimation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="Set" />

        <View
            android:layout_width="match_parent"
            android:layout_height="200dp" />

    </LinearLayout>
</ScrollView>
//属性动画  引擎是Animator
//       视图动画Animation
//加载在资源文件中定义的动画资源:
//  Animator alphaAnimator = AnimatorInflater.loadAnimator(this, R.animator.alpha);
//           alphaAnimator.setTarget(view);   alphaAnimator.start();
//  Animation alphaAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha);
//            view.startAnimation(alpha);
//ValueAnimator 的常用方法:ValueAnimator.ofInt(int values)、ofFloat(float value)、ofObject(int values)
//                         setInterpolator(new LinearInterpolator())运动方式
//ValueAnimator animation; 动画值float animatedValue = (float) animation.getAnimatedValue();
//view.animate().translationX(500f).setDuration(1000).start();
//     和ofFloat(view, "scaleX", 1.0f, 3.0f).start();
//先设置好两种类型的值,set.playTogether(rotateAnimator,moveAnimator);//一起启动
//                    set.playSequentially(rotateAnimator,moveAnimator);//按顺序
//    第二种方法,直接用 animate()连贯操作 ,一起进行 ,Delay是前摇时间。
//           view.animate().rotation(720).setDuration(1000).start();
//           view.animate().translationX(500).setDuration(1000).setStartDelay(1000).start();

public class PropertyActivity extends AppCompatActivity {

    //添加一个标签
    private static final String TAG = "PropertyActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_property);
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btnValueAnimator:
                ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1.0f);//0到1.0范围之间变化
                // 设置变化方式,使之匀速运动,让下面的完成度和实时动画值匀速变化。
                valueAnimator.setInterpolator(new LinearInterpolator());
                valueAnimator.setDuration(100);//时间
                //设置监听器,在监听时,首先要得到动画的值
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override//通过对象获取属性,在监听时,首先要得到动画的值value
                    public void onAnimationUpdate(ValueAnimator animation) {
                        float animatedFraction = animation.getAnimatedFraction();//当前变化完成度
                        //获取动画值,public Object getAnimatedValue() ,返回值是一个Object的原始类型,
                        //在设定动画初始值时使用的是ofFloat()函数,所以每个值的类型必定是float。
                        float animatedValue = (float) animation.getAnimatedValue();
                        //
                        Log.d(TAG, "onAnimationUpdate: " + String.format("%.3f  %.3f", animatedFraction, animatedValue));
                    }
                });
                //启动
                valueAnimator.start();
                break;

            case R.id.viewAlphaAnimation:
                Animator alphaAnimator =
                         AnimatorInflater.loadAnimator(this, R.animator.alpha);
                alphaAnimator.setTarget(view);
                alphaAnimator.start();
                ofFloat(view,"alpha",1.0f, 3.0f).start();
                break;

            case R.id.viewScaleAnimation:
                ofFloat(view, "scaleX", 1.0f, 3.0f).start();
                break;

                //方法后面加个By 是说动画将要改变多少,不加By就是改到多少
            //就是这两个 animateProperty(int constantName, float toValue)
            // 、animatePropertyBy(int constantName, float byValue)
            // byValue :The amount by which the property will change
            //  方法的区别,最后都要再转到
            //  animatePropertyBy(int constantName, float startValue, float byValue)
            case R.id.viewTranslateAnimation:
                view.animate().translationX
                        (500f).setDuration(1000).start();
                break;

            case R.id.viewRotateAnimation:
                view.animate().rotation(720).start();
                break;

            case R.id.viewSetAnimation:
                //在View当中有对应的setRotation方法  public void setRotation(float rotation){}
                //输入的参数必须是 rotation 不能是 rotate
                Animator rotateAnimator =
                        ObjectAnimator.ofFloat(view, "rotation", 0, 720);
                rotateAnimator.setDuration(1000);
                Animator moveAnimator =
                        ObjectAnimator.ofFloat(view, "x", 0, 500);
                moveAnimator.setDuration(1000);
                //AnimatorSet类
                AnimatorSet set = new AnimatorSet();
                set.playTogether(rotateAnimator,
                        moveAnimator);//一起启动
                set.playSequentially(rotateAnimator,
                        moveAnimator);//按顺序
                set.start();
                //第二种方法,直接用 animate()连贯操作 ,一起进行 ,Delay是前摇时间。
                view.animate().rotation
                        (720).setDuration(1000).start();
                view.animate().translationX
                        (500).setDuration(1000).setStartDelay(1000).start();

                break;
        }
    }

}
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <rotate
        android:duration="1000"
        android:fromDegrees="0"
        android:toDegrees="720"
        android:pivotX="50%"
        android:pivotY="50%"
        />

    <translate
        android:duration="1000"
        android:startOffset="1000"
        android:fromXDelta="0"
        android:toXDelta="500"
        android:fromYDelta="0"
        android:toYDelta="0"
        />

</set>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/renew"
        android:icon="@drawable/ic_autorenew_black_24dp"
        android:title="renew"
        app:showAsAction="always" />
</menu>

相关标签: 安卓入门