设置边距以完全隐藏 FrameLayout 中的元素

Set margin to entirely hide element from FrameLayout

我有一个框架布局,其中有两个子布局,其中一个是 LinearLayout (search_filters),就在我的工具栏下方。

    <!-- Your normal content view -->
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:animateLayoutChanges="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:background="#EEEEEE"
            android:id="@+id/main_parent_view"
            />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:background="@color/theme_primary"
            android:id="@+id/search_filters"
            android:padding="4dp"
            android:animateLayoutChanges="true"
            android:visibility="visible"
            android:elevation="2dp"
            android:layout_marginTop="-200dp"/>

(不确定我是如何设置 marginTop 的)

我想要达到的效果是 search_filters 从顶部(屏幕外)滑动到工具栏底部。

滑入

    Animation a = new Animation() {

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) searchFilters.getLayoutParams();
            params.topMargin = -(int)(400 * (1-interpolatedTime));
            searchFilters.setLayoutParams(params);
        }
    };
    a.setDuration(300); // in ms
    a.setInterpolator(new AccelerateDecelerateInterpolator());
    searchFilters.startAnimation(a);

滑开

    Animation a = new Animation() {

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) searchFilters.getLayoutParams();
            params.topMargin = -(int)(400 * interpolatedTime);
            searchFilters.setLayoutParams(params);
        }
    };
    a.setDuration(300); // in ms

android.R.interpolator.fast_out_slow_in); a.setInterpolator(新的 AccelerateDecelerateInterpolator());

    searchFilters.startAnimation(a);

问题是“400”完全是任意的,并不适用于所有设备(适用于我的 nexus 4 但不适用于我的 galaxy s4)。

如何更改我的代码以使视图始终消失(比如安全和动画 +25%)?

您可以使用

找到屏幕的高度
height = getWindowManager().getDefaultDisplay().getHeight()

然后,使用这个值作为topMargin来完成从屏幕上隐藏视图。

 params.topMargin = -(int)(height * interpolatedTime);

您还可以使用

找到视图的高度
mView.measure(0,0);
mViewHeight = mView.getMeasuredHeight();

然后使用该值作为边距。

**编辑:**或者为了让它更容易,在动画的 XML 中使用百分比值。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="300"
        android:fromYDelta="-100%"
        android:toYDelta="0%" />
</set>