摇动动画“滑入”其他小部件 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的主要内容,如果未能解决你的问题,请参考以下文章

Android 主屏幕小部件动画

Android 小部件:RemoteViews 上的动画? [复制]

Flutter:一次多次使用相同的动画小部件

带有小部件列表的 Flutter 动画切换器

使用动画在 ListView 中显示/隐藏小部件

是否可以在 Android 主屏幕小部件中向 im​​ageView 添加自定义可绘制对象?