如何动画布局从顶部到300dp的屏幕反之亦然?

Dar*_*hak 13 animation android slide

需求

我能翻译的布局基地toYDelta="100%toYDelta="50%等.

但我想仅在布局中设置动画布局300dp Height.

slide_down.xml

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromYDelta="0"
    android:toYDelta="100%" />
Run Code Online (Sandbox Code Playgroud)

slide_up.xml

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromYDelta="100%"
    android:toYDelta="0" />
Run Code Online (Sandbox Code Playgroud)

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 

    }
});
Run Code Online (Sandbox Code Playgroud)

小样

动画样机

问题

基于300dp高度如何做?

请帮我解决这个问题.

谢谢.

ant*_*nyt 40

查看动画

令人惊讶的是,似乎没有办法在XML中指定300dp的翻译动画.翻译动画XML语法接受三种不同的距离规范:

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

在创建TranslateAnimation via Java时,您也会受到相同的规范限制.但是,在Java中,您可以计算等效的绝对像素值(对于给定的设备)并将其作为像素平移距离提供.

要获得300dp,您可以在XML中定义300dp 的维度值,或者只是在代码中执行计算.

内部dimens.xml:

<dimen name="distance">300dp</dimen>
Run Code Online (Sandbox Code Playgroud)

在您的Activity/Fragment/etc中:

float distance = getResources().getDimensionPixelSize(R.dimen.distance);
Run Code Online (Sandbox Code Playgroud)

要么

在您的Activity/Fragment/etc中:

float distance = TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP, 300,
        getResources().getDisplayMetrics()
);
Run Code Online (Sandbox Code Playgroud)

然后,您需要做的就是在创建时使用该距离TranslateAnimation:

TranslateAnimation animation = new TranslateAnimation(
        Animation.ABSOLUTE, 0,
        Animation.ABSOLUTE, 0,
        Animation.ABSOLUTE, 0,
        Animation.ABSOLUTE, distance
);
Run Code Online (Sandbox Code Playgroud)

物业动画

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

view.animate().translationY(distance).setDuration(...).start();
Run Code Online (Sandbox Code Playgroud)

如果您仍然定位到Android 2.x,则可以使用NineOldAndroids来获得向后兼容的动画语法.它会自动为支持它的设备使用新的属性动画.

ViewPropertyAnimator.animate(view).translationY(distance).setDuration(...).start();
Run Code Online (Sandbox Code Playgroud)

  • @Darshak请奖励赏金:) (2认同)