查看动画在其他布局后面

时间:2015-08-01 16:04:51

标签: android android-animation

我正在尝试将视图设置为另一个布局的动画,但我遇到了一个问题,因为我的视图位于布局后面。我试过放android:animateLayoutChanges="true",但没有成功 我的代码:
layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true">
    <RadioButton
        android:id="@+id/radioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New RadioButton" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:animateLayoutChanges="true"
        android:background="#ffffff">

    </LinearLayout>
</RelativeLayout>

我的活动课程:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {

        float x = 300;
        float y = 300;
        RadioButton button = (RadioButton) findViewById(R.id.radioButton);
        button.animate().setDuration(10000).x(x).y(y);
    }
}

6 个答案:

答案 0 :(得分:10)

项目的绘制顺序与布局中的顺序相同。对于您的布局,将首先绘制RadioButton,然后绘制LinearLayout。如果它们重叠,则将在RadioButton上绘制LinearLayout。

解决方案部分#1: 翻转RadioButton和LinearLayout的顺序,以便始终最后绘制RadioButton。

<RelativeLayout
    android:id="@+id/final_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="30dp"
    android:background="#ffffff">
</RelativeLayout>

<RadioButton
    android:id="@+id/radioButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New RadioButton" />

Android Developer's site进行更严格的解释。

解决方案第2部分: 与我上面提出的观点无关,但可能同样重要,你需要启动动画师。更新了以下来源:

public class MainActivity extends AppCompatActivity {

    private RadioButton mRadioButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRadioButton = (RadioButton) findViewById(R.id.radioButton);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {

        float x = 300;
        float y = 300;

        ViewPropertyAnimator animator = mRadioButton.animate().setDuration(10000).x(x).y(y);
        animator.setListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {}
            @Override
            public void onAnimationEnd(Animator animation) {
                Log.d(TAG, "onAnimationEnd");
            }

            @Override
            public void onAnimationCancel(Animator animation) {}
            @Override
            public void onAnimationRepeat(Animator animation) {}
        })
        animator.start();
    }

    private static final String TAG = MainActivity.class.getSimpleName();
}

经过测试,在Android 5.1中的应用启动时动画。

答案 1 :(得分:5)

将所有 xml 布局元素属性设为android:clipChildren="false"&amp; android:clipToPadding="false"。并且不要忘记animatedView.bringToFront()

月前有同样的问题,经过几天的努力后找到了解决办法。找到我的阙。 here

答案 2 :(得分:2)

让我为您提供有关 480X854 像素mdpi屏幕的解决方案

480X854 pixel screen

场景1:您希望RadioButton使用RelativeLayout作为父ViewGroup跨越LinearLayout而不是您需要修复z顺序。将更改设置为如下布局。动画从A点开始(0,0)指向C(300,300)和RelativeLayout。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:background="#ffffff">
    </LinearLayout>

    <RadioButton
        android:id="@+id/radioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New RadioButton"
    />  
</RelativeLayout>

场景2:您希望RadioButton使用LinearLayout作为父ViewGroup在LinearLayout上设置动画,而不是如下所示设置布局。动画从B点(20,20)开始(根据layout_margin值)到点D(320,320)和RelativeLayout。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:background="#ffffff">

        <RadioButton
            android:id="@+id/radioButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New RadioButton"
        />
    </LinearLayout>

</RelativeLayout>

场景3:您希望RadioButton使用LinearLayout作为父ViewGroup在LinearLayout上进行动画处理,并且您的x或y值超出任一方向的LinearLayout边界大小,例如x = 800&gt; 480像素或Y = 1200> 854像素

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    <!-- Allow all the children to go out of their parent boundaries -->
    android:clipChildren="false"
>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="20dp"
    <!-- Allow all the children to go out of their parent boundaries -->
    android:clipChildren="false"
    <!-- Do not clip the children at the padding i.e. allow to children go 
    beyond the padding -->
    android:clipToPadding="false"
    android:background="#ffffff">

    <RadioButton
        android:id="@+id/radioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New RadioButton"
        />
    </LinearLayout>

</RelativeLayout>

我希望有帮助...
快乐的编码...

答案 3 :(得分:1)

我不确定您要实现的目标,但如果您要将孩子View移到其容器外,则需要停用clipChildrenclipToPadding属性在容器上,以便看到孩子在父母之外移动:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipChildren="false"
        android:clipToPadding="false">
        ...
   </RelativeLayout>

无论如何,如果您在某些视图中遇到 z-order 问题,可以使用bringToFront()方法;在你的情况下:

    final RadioButton button = (RadioButton) findViewById(R.id.radioButton);
    button.animate().setDuration(10000).x(x).y(y).setListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animator) {
        }

        @Override
        public void onAnimationEnd(Animator animator) {
            button.bringToFront();
        }

        @Override
        public void onAnimationCancel(Animator animator) {
        }

        @Override
        public void onAnimationRepeat(Animator animator) {
        }
    });

答案 4 :(得分:1)

根据您回复的先生Karaokyo的评论,我建议这是你想要的

RadioButton r1; // suppose you already referenced it
LinearLayout l1; //    //
Animation anim = AnimationUtils.loadAnimation(getBaseContext(), R.anim.abc_slide_in_top);
 // the R.anim. blah blah is the preferred animation you want
//when the time comes
if(r1.getParent() != null)
     ((ViewGroup)r1.getParent()).removeView(r1);
l1.addView(r1);
r1.startAnimation(anim); 
// you can create an animation listener and add the view when the animation
//starts

这里的问题是,它看起来就像你想要的那样。

答案 5 :(得分:1)

最简单的解决方案是尝试在xml中重新布局,以便在LinearLayout之后显示RadioButton。

在开始动画之前调用bringchildTofront(yourradiobutton) 要么 如果您想要对绘图顺序进行更多控制,请延长RelativeLayout并覆盖

protected int getChildDrawingOrder (int childCount, int i)