我正在尝试将视图设置为另一个布局的动画,但我遇到了一个问题,因为我的视图位于布局后面。我试过放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);
}
}
答案 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屏幕的解决方案
场景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
移到其容器外,则需要停用clipChildren
和clipToPadding
属性在容器上,以便看到孩子在父母之外移动:
<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)