1.逐帧动画
在drawable资源下加入逐帧图片,写进frame.xml文件中
写进
<animation-list
</animation-list>
该标签里
注意activity_main文件中相对布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/frame"
/>
MainActivity
package com.example.animation;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity {
//点击的时候 启动和停止 加一个标志位
private boolean flag = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout relativelayout = findViewById(R.id.rl);
AnimationDrawable animation = (AnimationDrawable) relativelayout.getBackground();
relativelayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//首先需要获取drawable
if (flag){
animation.start();
flag = false;
}else{
animation.stop();
flag = true;
}
}
});
}
}
点击图片,会启动和停止
2.补间动画
alpha透明度
rotate旋转
scale缩放
translate平移
activity_main.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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:adjustViewBounds="true"
android:maxWidth="300dp"
android:maxHeight="300dp"
android:src="@drawable/img"/>
</RelativeLayout>
alpha.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--初始值从全透明到不透明总共花费两秒钟-->
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="2000"
/>
</set>
MainActivity.java
package com.example.animtweened;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = findViewById(R.id.iv);
//set一个,里面new一个
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//通过加载xml动画设置文件来创建一个Animation对象
Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);//想要啥效果修改这个
//imageView来启动animation
imageView.startAnimation(animation);
}
});
}
}
点击后,从无到有
rotate旋转
添加rotate.xml文件
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--代表从哪个角度开始-->
<!-- 50%正中心开始-->
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"
/>
</set>
scale缩放
scale.xml文件
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--一开始是原始大小-->
<!-- 缩放为原来的一半-->
<scale
android:fromXScale="1"
android:fromYScale="1"
android:toXScale="0.5"
android:toYScale="0.5"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"
/>
</set>
translate平移
translate.xml文件
<?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>
3.属性动画
ValueAnimator
//从0f到1f 加值 实现值自动变化
package com.example.animproperty;
import androidx.appcompat.app.AppCompatActivity;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);
valueAnimator.setDuration(2000);//设置执行周期
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {//new一个更新监听
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();//拿到了一个当前的值
Log.e("double", "onAnimationUpdate: "+value);
}
});
valueAnimator.start();//启动的时候从0加到1f
}
}
ObjectAnimator
实现了渐变
package com.example.animproperty;
import androidx.appcompat.app.AppCompatActivity;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);
valueAnimator.setDuration(2000);//设置执行周期
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {//new一个更新监听
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();//拿到了一个当前的值
Log.e("double", "onAnimationUpdate: "+value);
}
});
valueAnimator.start();//启动的时候从0加到1f
TextView textView = findViewById(R.id.tv);//获取到tv
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,
"alpha",0f,1f);//textView从完全透明到完全不透明
objectAnimator.setDuration(4000);
objectAnimator.start();
}
}
//一些方法
package com.example.animproperty;
import androidx.appcompat.app.AppCompatActivity;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);
valueAnimator.setDuration(2000);//设置执行周期
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {//new一个更新监听
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();//拿到了一个当前的值
Log.e("double", "onAnimationUpdate: "+value);
}
});
valueAnimator.start();//启动的时候从0加到1f
TextView textView = findViewById(R.id.tv);//获取到tv
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,
"alpha",0f,1f);//textView从完全透明到完全不透明
objectAnimator.setDuration(4000);
objectAnimator.start();
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
//动画开始的时候调用
}
@Override
public void onAnimationEnd(Animator animator) {
//动画结束
}
@Override
public void onAnimationCancel(Animator animator) {
//被取消
}
@Override
public void onAnimationRepeat(Animator animator) {
//重复执行
}
});
//用适配的一个方式,去写一个start
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
}
});
}
}