摇动动画“滑入”其他小部件 android
Posted
技术标签:
【中文标题】摇动动画“滑入”其他小部件 android【英文标题】:Shake animation is "sliding underneath" other widgets android 【发布时间】:2012-11-22 10:30:06 【问题描述】:我是动画新手。我在按钮上有一个旋转动画。问题是当执行该按钮动画时,该按钮与布局中的其他按钮相交。因此,在动画期间,无法看到移动按钮,因为它被其他按钮覆盖。关于如何让我的动画停留在布局顶层的任何想法?我想找出一个兼容 API 8 的解决方案。
//create shake animation
final Animation shakeIt = AnimationUtils.loadAnimation(this, R.anim.shake);
findViewById(R.id.button_spin).startAnimation(shakeIt);
// use shake animation
spinnerButton.startAnimation(shakeIt);
编辑:(这里有更多信息)
所以在过去的几个小时里我一直在玩它并发现了更多的东西。 Lecho 的直觉是正确的,z 顺序是一个小部件是“高于”还是“低于”另一个的驱动因素。我面临的问题可能是因为两件事:
位于视图前面的按钮(我想将其移回)具有在活动结束附近编辑的文本。添加文本是否强制小部件重绘会更改该视图的 Z 顺序???
onResume() 中的按钮文本已更改,并且我似乎无法在该方法中更改按钮的 Z 顺序???
以上2个问题的答案将解决我的问题
编辑 2:有问题的 XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:background="@drawable/bg"
android:orientation="vertical"
>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
android:layout_weight=".7"
android:layout_marginTop="5dp" >
<Button
android:id="@+id/categoryButton"
android:layout_
android:layout_
android:background="@drawable/drop"
android:prompt="@string/planet_prompt"
android:paddingRight="20dp"
android:textColor="#000000"
android:textStyle="bold"
android:textSize="35dp"
/>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:layout_weight="0.1"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal"
android:layout_weight="1.5" >
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal"
android:layout_weight="1" >
</LinearLayout>
<Button
android:id="@+id/button_spin"
android:layout_
android:layout_weight="2.35"
android:layout_
android:background="@drawable/letseat"
android:layout_gravity="center_horizontal"
android:gravity="center" />
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal"
android:layout_weight="1" >
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:layout_weight="3"
android:orientation="vertical">
<Button
android:id="@+id/button_additems"
android:layout_
android:layout_weight="1"
android:layout_
android:background="@drawable/add_rest"
android:gravity="center_horizontal" />
<Button
android:id="@+id/button_showrestaurant"
android:layout_
android:layout_weight="1"
android:layout_
android:background="@drawable/edit_rest"
android:gravity="center_horizontal" />
<Button
android:id="@+id/button_nearbyplaces"
android:layout_
android:layout_weight="1"
android:layout_
android:background="@drawable/whats_near"
android:gravity="center_horizontal" />
</LinearLayout>
</LinearLayout>
【问题讨论】:
【参考方案1】:只是我的想法。在 android 中,z-order 由视图添加到 XML 的顺序决定。也许动画按钮是在另一个按钮之前添加到 xml 中的,因此它“更深”。稍后尝试在 XML 中添加动画按钮或在布局中使用方法 bringChildToFront(buttonView)
或从代码中将按钮添加到布局中。
编辑:
广告 1. 添加文字似乎不会改变 Z 顺序。当我更改文本并调用 button.bringToFront()
时,Z 顺序会更改,但当我单独调用 bringToFront()
或 setText()
时不会更改。
广告 2。在 onResume
中添加文本不会更改 Z 顺序,但方法 bringToFront()
似乎可以按预期工作。
我现在无法将这些方法与视图动画一起测试。
测试活动:
public class MainActivity extends Activity
private int i = 1;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button btn1 = (Button) findViewById(R.id.btn1);
final Button btn2 = (Button) findViewById(R.id.btn2);
btn2.bringToFront();
final Button btn3 = (Button) findViewById(R.id.btn3);
btn3.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
if ((i % 2) == 0)
final Button btn1 = (Button) findViewById(R.id.btn1);
btn1.setText("BUTTON_BLACK_NEW");
btn1.bringToFront();
else
final Button btn2 = (Button) findViewById(R.id.btn2);
btn2.setText("BUTTON_GREY_NEW");
btn2.bringToFront();
++i;
);
@Override
protected void onResume()
super.onResume();
if ((i % 2) == 0)
final Button btn1 = (Button) findViewById(R.id.btn1);
btn1.bringToFront();
else
final Button btn2 = (Button) findViewById(R.id.btn2);
btn2.bringToFront();
++i;
布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".MainActivity"
android:id="@+id/main_layout">
<Button
android:id="@+id/btn1"
android:layout_
android:layout_
android:background="@android:color/black"
android:text="BUTTON_BLACK"
android:textColor="@android:color/white" />
<Button
android:id="@+id/btn2"
android:layout_
android:layout_
android:background="@android:color/darker_gray"
android:text="BUTTON_GREY"
android:textColor="@android:color/black" />
<Button
android:id="@+id/btn3"
android:layout_
android:layout_
android:text="CHANGE_Z"
android:layout_below="@+id/btn2" />
</RelativeLayout>
【讨论】:
我遵循你的逻辑。但是,我的动画按钮是在 XML 中的其他小部件之后定义的。此外,在动画发生时,bringChildToFront() 方法似乎没有任何效果。还有其他想法吗? 你能看看我对原始问题的编辑吗?这可能是一个不寻常的案例 我开始认为我的带有嵌套布局的 xml 线性布局与它有关,并且 Bringtofront() 可能只是将小部件带到该特定嵌套布局的前面。你能看看我的 XML 吗? 是的,当我更改您的 xml 布局以使 btn 2 位于嵌套的线性布局内时,灰色不再能够被带到前面。关于如何强制将视图放在我的 XML 前端的任何想法?我需要保留这些嵌套布局,因为它非常适合所有屏幕尺寸。 看起来我可以将嵌套布局放在前面,从而将小部件放在前面。这很有趣以上是关于摇动动画“滑入”其他小部件 android的主要内容,如果未能解决你的问题,请参考以下文章