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

时间:2015-03-16 11:04:33

标签: android animation margin android-framelayout

我有一个带有两个孩子的Frame Layout,其中一个是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(new AccelerateDecelerateInterpolator());

    searchFilters.startAnimation(a);

问题在于&#34; 400&#34;是完全随意的,并不适用于所有设备(在我的nexus 4上运行,但不是我的galaxy s4)。

如何更改我的代码,以便视图始终消失(比如说,为satefy和动画添加+ 25%)?

1 个答案:

答案 0 :(得分:1)

您可以使用

找到屏幕的高度
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>