如何通过动画将视图从屏幕外移动到屏幕底部?

时间:2018-07-12 06:59:29

标签: android animation

我有一个视图,希望将它与动画一起从屏幕外移动到屏幕底部并反向移动!我已经尝试过了:

bottomRelative = findViewById(R.id.bottomRelative);
    int widthOfScreen = this.getWindowManager().getDefaultDisplay().getHeight();
    ObjectAnimator animator = ObjectAnimator.ofFloat(bottomRelative, "y", widthOfScreen, (widthOfScreen-700));
    animator.setDuration(2000);
    animator.start();

但是我无法设置确切的停车位置!我希望此视图从底部设置50个边距!

如何将视图的最终位置设置为屏幕底部的50页空白?

另一个问题是,使用不同的设备!使用上面的代码,该视图在2个设备中动画显示在我的屏幕上!但在4英寸设备中,无法正常工作! 我该如何解决这两个问题?

我认为通过为我的视图设置正确的目标,可以解决不同的设备问题。

1 个答案:

答案 0 :(得分:1)

我有一个解决方案,即使用startViewdestinationView这两个视图,通过这种方式将startView移到destinationView

假设我们有2个视图:startViewdestinationView

int[] startLoc = new int[2];
                    int[] desLoc = new int[2];
                    startView.getLocationOnScreen(startLoc);
                    destinationView.getLocationOnScreen(desLoc);
                    float x = desLoc[0]
                            - startLoc[0]
                            - (startView.getWidth() - destinationView.getWidth()) / 2;
                    float y = desLoc[1]
                            - startLoc[1]
                            - (startView.getHeight() - destinationView.getHeight()) / 2;
                    createMoveAndScaleThenFadeAnimation(
                            startView, x, y, 1.0f, 1, 1000, 300,
                            new AnimatorListenerAdapter() {
                                @Override
                                public void onAnimationEnd(Animator animation) {
                                    super.onAnimationEnd(animation);
                                }
                            }).start();

createMoveAndScaleThenFadeAnimation()方法:

public AnimatorSet createMoveAndScaleThenFadeAnimation(View view, float deltaX,
            float deltaY, float scaleFrom, float scaleTo, int duration, int offset,
            @Nullable final AnimatorListenerAdapter listener) {
        ObjectAnimator animX = ObjectAnimator.ofFloat(view, "translationX", deltaX);
        ObjectAnimator animY = ObjectAnimator.ofFloat(view, "translationY", deltaY);
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", scaleFrom, scaleTo);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", scaleFrom, scaleTo);
        ObjectAnimator fade = ObjectAnimator.ofFloat(view, "alpha", 1.0f, 0.0f);
        AnimatorSet animSet = new AnimatorSet();
        animSet.setDuration(duration);
        animSet.setStartDelay(offset);
        animSet.play(animX).with(animY).with(scaleX).with(scaleY).before(fade);
        if (listener != null) {
            animSet.addListener(listener);
        }
        return animSet;
    }

所以现在我们不在乎设备的屏幕尺寸或其他任何东西,只需在布局中定义2个视图并以这种方式即可。对于您而言,我们可以将视图2的可见性设置为“不可见”。

注意

在执行此操作之前,请确保已放大整个视图,否则,我们将无法获取视图的位置。

选项1:使用OnGlobalLayoutListener()

ViewTreeObserver vto=view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@Override public void onGlobalLayout(){
  //Here we can get the view's position and view size
  view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}

选项2 覆盖onWindowFocusChanged()

@Override
 public void onWindowFocusChanged(boolean hasFocus) {
  // TODO Auto-generated method stub
  super.onWindowFocusChanged(hasFocus);
  // Here we can get the view's position and view size
 }

感谢@Azin Nilchi的建议。

希望这会有所帮助!