Android(安卓)Animation之TranslateAnimation(平移动画)
16lz
2021-01-24
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); }}
好了,本篇文章就这样了,存在不足的地方还望指导,感谢
源码下载
更多相关文章
- Android(安卓)进阶
- Android(安卓)平滑和立体翻页效果1
- [置顶] Android的Activity屏幕切换动画(一)-左右滑动切换
- android布局属性使用说明和一些开发经验
- Android启动画面的实现方法
- android学习-动画(基本的四种动画)
- Android显示GIF动画 GifView
- android 仿iphoneX上滑退出应用动画(三)
- 安卓文件读写操作方法汇总