安卓动画学习(较浅显)

Posted 春招进大厂的梦想家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓动画学习(较浅显)相关的知识,希望对你有一定的参考价值。

安卓动画

一、逐帧动画

1.定义:把几张图片进行快速的播放就是逐帧动画

下面演示的demo是触碰图片进行动画的播放

2.添加几张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fffY5nI7-1623229374008)(C:\\Users\\23737\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210609154726838.png)]

3.在drawable文件下面添加一个frame.xml文件

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

    <item android:drawable="@drawable/one" android:duration="120"/>
    <item android:drawable="@drawable/two" android:duration="120"/>
    <item android:drawable="@drawable/three" android:duration="120"/>
    <item android:drawable="@drawable/four" android:duration="120"/>
    <item android:drawable="@drawable/five" android:duration="120"/>

</animation-list>

4.把主活动的xml修改了

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/Animation"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/frame"
    tools:context=".AnimationActivity">


</RelativeLayout>

把刚才创建的frame.xml文件当做背景导入主活动

5.在java文件下进行动画的展示

public class AnimationActivity extends AppCompatActivity {

    private boolean flag = true;

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


        //获得动画的Drawable资源
        RelativeLayout relativeLayout = findViewById(R.id.Animation);
        AnimationDrawable anim = (AnimationDrawable) relativeLayout.getBackground();
        relativeLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (flag) {
                    //启动动画
                    anim.start();
                    flag = false;
                }else {
                    //停止动画
                    anim.stop();
                    flag = true;
                }
            }
        });
    }
}

首先呢需要设置一个标志位,标志图片是否遍历完成

接着就是找到控件,得到背景,设置点击事件,启动动画/结束动画

二、补间动画

补间动画:给动画设置初始值和结束值,设置一个变化时间,安卓系统会自动将动画补全。

分类:

  • alpha:透明度
  • rotate:旋转
  • scale:缩放
  • translate:平移

1.首先先在res文件下创一个anim文件夹

2.在anim文件下创一个xml文件,命名为alpha

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

    <alpha android:duration="2000"
        android:fromAlpha="0" android:toAlpha="1" />

</set>

3.在主活动的xml文件下进行修改

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".tweenAnimation">

    <ImageView
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/iv"
        android:maxWidth="300dp"
        android:maxHeight="300dp"
        android:adjustViewBounds="true"
        android:src="@drawable/ceshi"/>

  </RelativeLayout>

4.在主活动的java文件下修改代码

public class tweenAnimation extends AppCompatActivity {

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

        ImageView imageView = findViewById(R.id.iv);

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //通过加载xml动画设置文件来创建一个Animation对象
                Animation animation = AnimationUtils.loadAnimation(tweenAnimation.this, R.anim.alpha);
                //开启动画
                imageView.startAnimation(animation);
            }
        });
    }
}

通过设置不同的操作类型来实现不同的效果。

例如平移、缩放、旋转等

旋转

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

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

</set>

平移

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

    <translate android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="400"
        android:toYDelta="400"
        android:duration="2000"/>

</set>

缩放

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

    <scale android:duration = "2000"
        android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="0.5"
        android:toYScale="0.5"
        android:pivotY="50%"
        android:pivotX="50%"/>

</set>

然后在java文件下修改就好了

public class tweenAnimation extends AppCompatActivity {

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

        ImageView imageView = findViewById(R.id.iv);

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //通过加载xml动画设置文件来创建一个Animation对象
                //透明度
//                Animation animation = AnimationUtils.loadAnimation(tweenAnimation.this, R.anim.alpha);
//                imageView.startAnimation(animation);

                //缩放
//                Animation animation = AnimationUtils.loadAnimation(tweenAnimation.this, R.anim.scale);
//                imageView.startAnimation(animation);

                //平移
//                Animation animation = AnimationUtils.loadAnimation(tweenAnimation.this, R.anim.translate);
//                imageView.startAnimation(animation);

                //旋转
                Animation animation = AnimationUtils.loadAnimation(tweenAnimation.this, R.anim.rotate);
                imageView.startAnimation(animation);
            }
        });
    }
}

三、属性动画

1.ValueAnimator

//属性动画

        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f,1f);
        valueAnimator.setDuration(2000);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();
            }
        });
        valueAnimator.start();

2.ObjectAnimator

TextView textView = findViewById(R.id.text_animation);
        //ObjectAnimator使得text的透明度由完全透明变成完全不透明
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,"alpha",0f,1f);
        objectAnimator.setDuration(4000);
        objectAnimator.start();

3.监听器

//监听器
        objectAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            //动画开始的时候调用
            public void onAnimationStart(Animator animation) {

            }

            @Override
            //动画结束的时候调用
            public void onAnimationEnd(Animator animation) {

            }

            @Override
            //动画被取消的时候调用
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            //动画重复执行的时候调用
            public void onAnimationRepeat(Animator animation) {

            }
        });

全部代码

public class tweenAnimation extends AppCompatActivity {

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

        //属性动画

        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f,1f);
        valueAnimator.setDuration(2000);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();
            }
        });
        valueAnimator.start();


        TextView textView = findViewById(R.id.text_animation);
        //ObjectAnimator使得text的透明度由完全透明变成完全不透明
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,"alpha",0f,1f);
        objectAnimator.setDuration(4000);
        objectAnimator.start();

        //监听器
        objectAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            //动画开始的时候调用
            public void onAnimationStart(Animator animation) {

            }

            @Override
            //动画结束的时候调用
            public void onAnimationEnd(Animator animation) {

            }

            @Override
            //动画被取消的时候调用
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            //动画重复执行的时候调用
            public void onAnimationRepeat(Animator animation) {

            }
        });
}

四、拓展:单位和尺寸

一、px和pt的区别

1.px

px: pixels(像素),不同设备的显示效果相同

2.pt

pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单实用

二、dp和sp的作用

1.dp

dp(dip): device independent pixels(设备独立像素),不同的设备会有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。

2.sp

sp:scaled pixels(放大像素),主要用于字体显示best for textsize

三、LayoutParams

LayoutParams相当于是一个Layout的信息包,封装了layout的位置、宽高等信息.

以上是关于安卓动画学习(较浅显)的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段7——CSS动画

VSCode自定义代码片段7——CSS动画

java 代码片段【安卓】

安卓 编程如何为一个图片加上透明度和平移两个动画

使用嵌套片段和动画对象

Android:将“ViewPager”动画从片段更改为片段