设置边距以完全隐藏 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>
我有一个框架布局,其中有两个子布局,其中一个是 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>