Android Animation之TranslateAnimation(平移动画)

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值