Android的View Animation(视图动画)中的Tween Animation效果,Tween Animation分为4种动画效果,分别是:alpha (透明变化) translate(位置移动) scale(缩放) rotate(旋转),而本篇文章说的是translate(位置移动)的效果。
Translate动画是非常好理解,就是定义一个开始的位置和一个结束位置,定义移动时间,然后就能自动产生移动动画。Android的translate移动方向有 横向(X) 竖向(Y)。
TranslateAnimation共有三个构造方法。除了第一个,另外两个参数稍微有点区别
- fromXDelta:动画起始时 X坐标上的移动位置
- toXDelta: 动画结束时 X坐标上的移动位置
- fromYDelta: 动画起始时Y坐标上的移动位置
- oYDelta:动画结束时Y坐标上的移动位置
- fromXType:指定X轴的平移模式,可以取值Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_PARENT。
- fromXValue:X平移起始值
- toXType:指定X轴的平移模式,可以取值Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_PARENT。
- toXValue:X平移结束值
- fromYType:指定Y轴的平移模式,可以取值Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_PARENT。
- fromTValue:Y平移起始值
- toYType:指定Y轴的平移模式,可以取值Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_PARENT。
- toYValue:Y平移结束值
下面展示一个使用平移动画来实现的一个dome按照惯例,我们先看看效果图:
package com.example.myapplication;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private View view1;
private LinearLayout view2;
private int view1MaxTopMargin = 178;
private int view1MinTopMargin = 88;
private int view2MaxTopMargin = 210;
private int view2MinTopMargin = 56;
private int view2LeftMargin = 44;
private int view2RightMargin = 44;
private boolean canMovingUp = true;
private boolean canMovingDown = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view1 = (View)findViewById(R.id.view1);
view2 = (LinearLayout)findViewById(R.id.view2);
findViewById(R.id.btn_move_up).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!canMovingUp) {
return;
}
moveUpAnimation(view1, view1MinTopMargin, view1MaxTopMargin, 0, 0);
moveUpAnimation(view2, view2MinTopMargin, view2MaxTopMargin, view2LeftMargin, view2RightMargin);
}
});
findViewById(R.id.btn_move_down).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!canMovingDown) {
return;
}
moveDownAnimation(view1, view1MinTopMargin, view1MaxTopMargin, 0, 0);
moveDownAnimation(view2, view2MinTopMargin, view2MaxTopMargin, view2LeftMargin, view2RightMargin);
}
});
}
private void moveUpAnimation(final View view, final int minTopMargin, final int maxTopMargin, final int mLeftMargin, final int mRightMargin) {
AnimationSet mAnimatorSet = new AnimationSet(true);
TranslateAnimation moveUpAnimation = new TranslateAnimation(0F, 0F, 0, -dpToPx(maxTopMargin - minTopMargin));
moveUpAnimation.setDuration(300);//设置动画变化的持续时间
moveUpAnimation.setFillEnabled(true);//使其可以填充效果从而不回到原地
moveUpAnimation.setFillAfter(true);//不回到起始位置
mAnimatorSet.addAnimation(moveUpAnimation);
view.startAnimation(mAnimatorSet);
mAnimatorSet.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
canMovingUp = false;
canMovingDown = true;
view.clearAnimation();
//动画结束后更新view到终点位置
FrameLayout.LayoutParams ll = new FrameLayout.LayoutParams(view.getLayoutParams());
ll.setMargins(dpToPx(mLeftMargin), dpToPx(minTopMargin), dpToPx(mRightMargin), dpToPx(maxTopMargin - minTopMargin));
view.setLayoutParams(ll);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
private void moveDownAnimation(final View view, final int minMargin, final int maxMargin, final int mLeftMargin, final int mRightMargin) {
AnimationSet mAnimatorSet = new AnimationSet(true);
TranslateAnimation moveDownAnimation = new TranslateAnimation(0F, 0F, 0f, dpToPx(maxMargin - minMargin));
moveDownAnimation.setDuration(300);//设置动画变化的持续时间
moveDownAnimation.setFillEnabled(true);//使其可以填充效果从而不回到原地
moveDownAnimation.setFillAfter(true);//不回到起始位置
mAnimatorSet.addAnimation(moveDownAnimation);
view.startAnimation(mAnimatorSet);
mAnimatorSet.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
canMovingUp = true;
canMovingDown = false;
view.clearAnimation();
//动画结束后更新view到终点位置
FrameLayout.LayoutParams ll = new FrameLayout.LayoutParams(view.getLayoutParams());
ll.setMargins(dpToPx(mLeftMargin), dpToPx(maxMargin), dpToPx(mRightMargin), 0);
view.setLayoutParams(ll);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
/**
* dp转换为px
*/
public static int dpToPx(float dp) {
return (int) (dp * Resources.getSystem().getDisplayMetrics().density + 0.5f);
}
}
好了,本篇文章就这样了,存在不足的地方还望指导,感谢
源码下载