你好,我试图制作动画有问题。
我使用此库AndroidViewAnimations。
这是我的布局xml代码:
<Button
android:id="@+id/buttonDetails"
style="@style/Button_Details"/>
<LinearLayout
android:id="@+id/linearLayoutDetails"
android:visibility="gone"
style="@style/LinearLayout_Details">
<CheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/checkbox_clmn_text"
android:checked="true"/>
<CheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/checkbox_clme_text"
android:checked="true"/>
<CheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/checkbox_clmn_text"
android:checked="true"/>
<CheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/checkbox_clmn_text"
android:checked="true"/>
<CheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/checkbox_clmn_text"
android:checked="true"/>
<CheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/checkbox_clmn_text"
android:checked="true"/>
</LinearLayout>
这是我的java代码:
// Declare Variables
@ViewById
LinearLayout linearLayoutDetails;
@Click
void buttonDetails() {
// Checks Linear Layout Visibility
if (linearLayoutDetails.getVisibility() == View.GONE) {
// Sets linearLayoutDetails Visibility to VISIBLE
linearLayoutDetails.setVisibility(View.VISIBLE);
// Makes Appear Animation
YoYo.with(Techniques.SlideInDown)
.duration(700)
.playOn(linearLayoutDetails);
} else {
linearLayoutDetails.setVisibility(View.GONE);
}
}
现在问题是我第一次按下按钮时动画不起作用,但之后每隔一段时间就有效。
我做了一些研究,我发现问题是我的可见性设置已经消失,如果我将其设置为不可见,它从第一次开始就可以正常工作。事情是,我不希望可见性变得不可见,但是因为我不希望线性布局在隐藏时占用空间。
有什么想法吗?
答案 0 :(得分:5)
我刚刚使用ViewTreeObserver解决了几分钟前的问题。在下面的示例中,变量currentMode
是我想要进出动画的视图。它的默认值是&#34;消失了#34;而且我遇到了与你相同的问题。
以下是我如何解决它:
ViewTreeObserver vto = currentMode.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if(currentMode.isShown()) {
YoYo.with(Techniques.SlideInDown).duration(250).playOn(currentMode);
}
}
});
currentMode.setVisibility(mShouldShowMode ? View.VISIBLE : View.GONE);
使用ViewTreeObserver,我们可以观察UI的全局变化,然后做出反应。 View.isShown()
方法检查它是否可见。如果是这样,那么我然后开始动画。这对我很有用。
然后,对于退出动画,您必须将侦听器附加到out动画,如下所示:
YoYo.with(Techniques.SlideOutUp).duration(250).withListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
currentMode.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}).playOn(currentMode);
答案 1 :(得分:0)
解决方法:
boolean firstTIme = true;
(...)
@Click
void buttonDetails() {
// Checks Linear Layout Visibility
if (linearLayoutDetails.getVisibility() == View.GONE || firstTIme) {
firstTIme = false;
linearLayoutDetails.setVisibility(View.VISIBLE);
YoYo.with(Techniques.SlideInDown)
.duration(700)
.playOn(linearLayoutDetails);
} else {
linearLayoutDetails.setVisibility(View.GONE);
}
}
答案 2 :(得分:0)
如果您正在使用YoYo Library,请尝试此操作。
YoYo.with(Techniques.SlideInDown)
.duration(400)
.withListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
//this will do the trick
YoYo.with(Techniques.Landing)
.duration(1)
.playOn(view);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
})
.playOn(view);
您还可以将其用于任何视图对象的连续动画。
答案 3 :(得分:0)
我有一个类似的问题,即使接受了答案,我也无法让它发挥作用。所以我做了这个
TransitionInflater inflater = TransitionInflater.from(context);
Transition transition = inflater.inflateTransition(R.transition.yoyo_transition);
transition.addListener(new Transition.TransitionListener() {
...
@Override
public void onTransitionEnd(Transition transition) {
do_stuff_with_yoyo();
}
...
});
TransitionManager.beginDelayedTransition((ViewGroup) getRootView(), transition);
yoyo.setVisibility(View.VISIBLE);
yoyo_transition.xml
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeBounds android:duration="0">
<targets>
<target android:targetId="@+id/yoyo_id"></target>
</targets>
</changeBounds>
<fade android:duration="0">
<targets>
<target android:targetId="@+id/yoyo_id"></target>
</targets>
</fade>
</transitionSet>