帧动画、视图动画、属性动画
程序员文章站
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>
上一篇: Java实现链式栈