- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个自定义搜索面板,它是主布局的一部分。大多数时候面板是隐藏的。我想在面板上添加出现/消失的动画。这是简化的布局摘录:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<RelativeLayout
android:id="@+id/layoutSearch"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone" >
<EditText
android:id="@+id/editSearch"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<<Other inner views to be animated>>
</RelativeLayout>
<<Other views, which should not be affected by the animation>>
</LinearLayout>
尝试 1:我添加了动画资源并使用 XML 中的这一行将它们附加到 @id/layoutSearch:
android:layoutAnimation="@anim/search_in_layout"
动画/search_in.xml:
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/overshoot_interpolator"
android:fromYDelta="-100%p"
android:toYDelta="0"
android:duration="@android:integer/config_longAnimTime" />
anim/search_in_layout.xml:
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/search_in" />
动画效果很好,但仅适用于出现的面板。当我隐藏它时,面板会在没有动画的情况下立即消失:
mSearchLayout.setVisibility(View.GONE);
尝试 2:我猜上述解决方案不起作用,因为动画目标参数与当前面板位置匹配。 OK,我又创建了两个动画资源:anim/search_out.xml 和anim/search_out_layout.xml。唯一的区别是交换了“fromYDelta”和“toYDelta”值以及更新了“android:animation”值。然后我在代码中加载资源并将它们设置为 @id/layoutSearch,如下所示:
LayoutAnimationController controller =
AnimationUtils.loadLayoutAnimation(this, R.anim.search_out_layout);
mSearchLayout.setLayoutAnimation(controller);
“out”动画在调用 setLayoutAnimation() 时触发。动画结束后,搜索面板返回到“退出”动画之前屏幕上的原始位置。如果我尝试在 setLayoutAnimation() 之后立即调用 mSearchLayout.setVisibility(View.GONE),我看不到任何动画,面板立即消失。
尝试 3:我想我需要在代码中创建动画,然后在其上设置一个监听器。然后我应该在 onAnimationEnd() 处理程序中调用 mSearchLayout.setVisibility(View.GONE) 以在动画播放后隐藏面板。我还没有尝试过。我认为这太复杂了。
我想我错过了一些重要的事情。有没有一种方法可以更轻松地实现 GONE 动画?
最佳答案
继续上面的答案:这是我解决这个问题的方法。
请注意,在动画中设置 setFillBefore 和 setFillAfter 会导致以下错误! Issue 5272: View with visibility View.GONE still generates touch eventshttp://code.google.com/p/android/issues/detail?id=5272
文件:MyWebViewActivity.java
private View mBottomOverlay;
private View mTopOverlay;
private boolean mControlsOverlayVisible;
private Animation mSlideBottomUpAnimation;
private Animation mSlideBottomDownAnimation;
private Animation mSlideTopDownAnimation;
private Animation mSlideTopUpAnimation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.reader_layout);
// load the overlay resources
mTopOverlay = findViewById(R.id.reader_overlay_top_toolbar);
mBottomOverlay = findViewById(R.id.reader_overlay_bottom_toolbar);
initAnimations();
}
private void initAnimations() {
final AnimationListener makeTopGone = new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {}
@Override
public void onAnimationRepeat(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {
Log.d(TAG, "onAnimationEnd - makeTopGone");
mTopOverlay.setVisibility(View.GONE);
}
};
final AnimationListener makeBottomGone = new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
Log.d(TAG, "onAnimationEnd - makeBottomGone");
mBottomOverlay.setVisibility(View.GONE);
}
};
final AnimationListener makeTopVisible = new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Log.d(TAG, "onAnimationStart - makeTopVisible");
mTopOverlay.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {}
};
final AnimationListener makeBottomVisible = new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Log.d(TAG, "onAnimationStart - makeBottomVisible");
mBottomOverlay.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {}
};
mSlideTopUpAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_top_up);
mSlideBottomDownAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_bottom_down);
mSlideTopUpAnimation.setAnimationListener(makeTopGone);
mSlideBottomDownAnimation.setAnimationListener(makeBottomGone);
mSlideTopDownAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_top_down);
mSlideBottomUpAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_bottom_up);
mSlideTopDownAnimation.setAnimationListener(makeTopVisible);
mSlideBottomUpAnimation.setAnimationListener(makeBottomVisible);
}
private void hideControlOverlays() {
Log.d(TAG, "hideControlOverlays");
mTopOverlay.startAnimation(mSlideTopUpAnimation);
mBottomOverlay.startAnimation(mSlideBottomDownAnimation);
mControlsOverlayVisible = false;
}
private void showControlOverlays() {
Log.d(TAG, "showControlOverlays");
mTopOverlay.startAnimation(mSlideTopDownAnimation);
mBottomOverlay.startAnimation(mSlideBottomUpAnimation);
mControlsOverlayVisible = true;
}
文件:/res/layout/reader_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/reader_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/reader_overlay_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:id="@+id/reader_overlay_top_toolbar"
android:layout_width="fill_parent"
android:layout_height="140dp"
android:background="#80000000" >
<include layout="@layout/toolbar_top" />
</LinearLayout>
<LinearLayout
android:id="@+id/reader_overlay_bottom_toolbar"
android:layout_width="fill_parent"
android:layout_height="140dp"
android:layout_gravity="bottom"
android:background="#80000000"
android:orientation="horizontal" >
<include layout="@layout/toolbar_bottom_left" />
</LinearLayout>
</FrameLayout>
</FrameLayout>
文件:/res/anim/slide_bottom_down.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillEnabled="true"
android:interpolator="@android:anim/accelerate_interpolator" >
<translate
android:duration="@android:integer/config_shortAnimTime"
android:fromYDelta="0"
android:toYDelta="100%" />
</set>
文件:/res/anim/slide_bottom_up.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator" >
<translate
android:duration="@android:integer/config_shortAnimTime"
android:fromYDelta="100%"
android:toYDelta="0" />
</set>
文件:/res/anim/slide_top_down.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator" >
<translate
android:duration="@android:integer/config_shortAnimTime"
android:fromYDelta="-100%"
android:toYDelta="0" />
</set>
文件:/res/anim/slide_top_up.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillEnabled="true"
android:interpolator="@android:anim/accelerate_interpolator" >
<translate
android:duration="@android:integer/config_shortAnimTime"
android:fromYDelta="0"
android:toYDelta="-100%" />
</set>
关于android - 制作 GONE 动画的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5591686/
我最近从 mysql_ 切换到 PDO,这真的很痛苦。一切看起来都那么复杂。 过去我开发了一个系统,用户可以导入包含记录的 csv。然后通过 while 循环将这些行导入数据库。它在 mysql_qu
android 布局使用 layout_weight。我的目标是所有组件的 1/3,但有时页脚实际上设置为消失,然后可见。从 gone 设置为 visible 时,权重计算如何工作?我没有看到具有 1
我想要一个小的“标题”,当我单击它时,其余内容会使用向上滑动动画显示。 我已经尝试了一些动画,但我唯一想做的就是在其父级中为内容设置动画。我想要的是,当我单击标题时,整个标题和内容(具有可见性 GON
我使用 Firebase 和 RadioButton 获得 2 种类型的数据,我对显示的数据进行排序。一切似乎都正常,但是当隐藏其中一种数据类型时仍然有一个空白空间。告诉我如何正确隐藏/显示数据。 T
我的 Jersey API 如下: @DELETE @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON
在 VBA Excel 中,如果我在关闭并再次打开文件后使用 UserInterFaceOnly:=True 选项保护工作表,则 UserInterFaceOnly 模式不会激活,只有密码保护。 代码
如果设备设置为英国英语,我不想显示布局。最好的方法是什么?每次获取设备语言? 最佳答案 往这边走,GB代表大不列颠(英国) String locale = context.getResources()
我的布局中有来自设计支持库的 FAB: //....
当我尝试在 Eclipse 中使用图形布局界面(而不是 xml)进行布局时,我遇到了这个问题: 假设我的主要布局只是屏幕底部的一个简单按钮,单击该按钮时,会打开一个覆盖大部分屏幕的文本框。 注意:我这
在我的应用程序中,我有 RelativeLayout 和任何小部件,进入布局,我想通过 xml 动画将其向上移动。 RelativeLayout 可见性为 GONE 并且必须再次将可见性设置为 GON
我的 XMl 中有这段代码。由于某种原因, View 仍然可见。我还有其他 block 可以使其在特定时间点可见,但我已经将它们注释掉了。这是保留此 View 的最后一段代码,出于某种原因我仍然可以看
我有一个包含一个 TextView 和两个图像的相对布局(宽度固定宽度,高度 = 48dip)。当我为一张图片设置 visibility view.gone 时,它不会释放空间 最佳答案
所以我有一个应用程序,当用户点击 button 时,将为带按钮的 layout 执行 animation(例如 滑动菜单),然后如果他点击另一个按钮,它必须使第一个布局不可见或消失,然后是新布局。 但
我想问一下,如何为 Admob 实现 AdListner。我希望广告在点击后消失。我试过了,但没有用。 final AdView ad1 = (AdView) findViewById(R.id.ad
我想将一个 View 设置为 GONE,然后让其他 View 占用剩余空间。 现在,如果我将它设置为 GONE,它会在布局中原来的位置留下一个空间,该 View 是一个具有固定高度的 viewpage
pypi.python.org has been migrated to pypi.org之后,我在尝试像往常一样使用命令将包上传到 PyPI 时遇到错误: python2.7 setup.py sd
我有一个自定义搜索面板,它是主布局的一部分。大多数时候面板是隐藏的。我想在面板上添加出现/消失的动画。这是简化的布局摘录: > > 尝
我遇到了一个问题,即可见性状态为 GONE 的 View (不希望地)占用了屏幕空间。这个问题总是发生在 API 级别 <= 7 的设备上,但最近才发生在 8+ 设备上(在我使用 AsyncTasks
所以我的应用程序中有一个 GLSurfaceView,由 GLSurfaceView.Renderer 渲染并使用 JPCt 作为库。 表面处于不可见的 RelativeLayout 中(可见性:消失
我有一个巨大的 XML 布局,其中有许多 Relative/Linear 布局,我现在正在做的是使用 setVisibility (View. GONE) 并在需要时更改其可见性。 我的问题是:这种方
我是一名优秀的程序员,十分优秀!