【问题标题】:How to animate layout from top to 300dp of screen vice versa in android?如何在android中从顶部到屏幕300dp的动画布局,反之亦然?
【发布时间】:2014-06-14 00:19:00
【问题描述】:

要求

我可以根据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%" />

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的高度如何做?

请帮我解决这个问题。

谢谢。

【问题讨论】:

    标签: android animation slide


    【解决方案1】:

    查看动画

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

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

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

    要获得 300dp,您可以在 XML 中定义一个 300dp 的dimen value,或者直接在代码中执行计算。

    内部dimens.xml

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

    在您的 Activity/Fragment/etc 中:

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

    在您的 Activity/Fragment/etc 中:

    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 及以上,你可以使用新的Property Animation 框架更优雅地表达相同的动画:

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

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

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

    【讨论】:

    • @Darshak 请奖励赏金 :)
    猜你喜欢
    • 2022-07-07
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 2013-10-31
    • 1970-01-01
    相关资源
    最近更新 更多