如何在安卓中实现布局从屏幕顶部到300dp的动画效果?

15

要求

我可以根据toYDelta="100%toYDelta="50%等来翻译布局。

但我希望只在300dp高度的情况下对布局进行动画处理。

slide_down.xml

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromYDelta="0"
    android:toYDelta="100%" />

slide_up.xml

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromYDelta="100%"
    android:toYDelta="0" />

Java代碼(動畫)

Animation animation = AnimationUtils.loadAnimation(getActivity().getApplicationContext(),R.anim.slide_down);
animation.setAnimationListener(new AnimationListener() {

    @Override
    public void onAnimationStart(Animation animation) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onAnimationEnd(Animation animation) {
        // TODO Auto-generated method stub

        // I can hide layout after animation completion 

    }
});

模型

动画模型

问题

如何基于300dp的高度进行操作?

请帮我解决这个问题。

谢谢。

1个回答

46

视图动画

令人惊讶的是,似乎没有一种方法可以在XML中指定300dp的平移动画。平移动画XML语法接受三种不同的距离规范:

  • 相对于正常位置的绝对像素(例如android:toYDelta="10"
  • 相对于元素宽度/高度的百分比(例如android:toYDelta="10%"
  • 相对于父级宽度/高度的百分比(例如android:toYDelta="10%p"

创建TranslateAnimation通过Java时也必须遵守相同的规范。但是,在Java中,您可以计算等效的绝对像素值(针对给定设备),并将其作为像素平移距离提供。

要获得300dp,您可以在XML中定义一个dimen值为300dp,或者只需在代码中执行计算即可。

dimens.xml内:

<dimen name="distance">300dp</dimen>

在您的Activity/Fragment等内部:

float distance = getResources().getDimensionPixelSize(R.dimen.distance);

或者

在您的 Activity/Fragment 等内部:

float distance = TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP, 300,
        getResources().getDisplayMetrics()
);

然后,您只需要在创建TranslateAnimation时使用该距离即可:

TranslateAnimation animation = new TranslateAnimation(
        Animation.ABSOLUTE, 0,
        Animation.ABSOLUTE, 0,
        Animation.ABSOLUTE, 0,
        Animation.ABSOLUTE, distance
);

属性动画

如果您的目标是 Android 3.0 及以上版本,则可以使用新的属性动画框架更加优雅地表达相同的动画:

view.animate().translationY(distance).setDuration(...).start();

如果你仍然需要支持 Android 2.x,可以使用NineOldAndroids来获取向后兼容的动画语法。它会自动为支持新属性动画的设备使用新的属性动画。

ViewPropertyAnimator.animate(view).translationY(distance).setDuration(...).start();

2
@Darshak 请颁发悬赏 :) - antonyt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接