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);   }}

好了,本篇文章就这样了,存在不足的地方还望指导,感谢
源码下载

更多相关文章

  1. Android(安卓)进阶
  2. Android(安卓)平滑和立体翻页效果1
  3. [置顶] Android的Activity屏幕切换动画(一)-左右滑动切换
  4. android布局属性使用说明和一些开发经验
  5. Android启动画面的实现方法
  6. android学习-动画(基本的四种动画)
  7. Android显示GIF动画 GifView
  8. android 仿iphoneX上滑退出应用动画(三)
  9. 安卓文件读写操作方法汇总

随机推荐

  1. Android(安卓)中的注解详细介绍
  2. 关于android的广播接收器(1)—基础篇
  3. mac 系统下android源码下载以及使用(总结)
  4. Android(安卓)Sip学习(四)Android自带SipDe
  5. 《android framework常用api源码分析》之
  6. Android的消息机制之Handler源码解析
  7. Android菜鸟的成长笔记(6)——剖析源码学自
  8. Android智能手机搜索不到路由器无线信号
  9. Google 推出 Android(安卓)Design 網站,教
  10. Android通过adb查看wifi密码