#android #android-layout #android-animation
#Android #android-макет #android-анимация
Вопрос:
Мне нужна помощь с анимацией. (Мои представления более сложные, и я показываю вам только основные элементы моего XML-макета)
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true" >
<LinearLayout
android:id="@ id/oneBigView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:orientation="vertical">
</LinearLayout>
<LinearLayout
android:id="@ id/fourSmallViews"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="2" >
<RelativeLayout
android:id="@ id/topLeft"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" >
</RelativeLayout>
<RelativeLayout
android:id="@ id/topRight"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="invisible"
android:weightSum="2" >
<RelativeLayout
android:id="@ id/bottomLeft"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" >
</RelativeLayout>
<RelativeLayout
android:id="@ id/bottomRight"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" >
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
Я хочу показать и скрыть некоторые виды:
- Вид не отображается
- TopLeft и topRight перемещаются от краев (TopLeft слева, topRight справа) к центру экрана (родительский).
- Когда TopLeft и topRight выполняют половину своего перемещения, bottomLeft и bottomRight отображаются точно так же, как TopLeft и topRight на предыдущем шаге
- Все четыре вида остаются видимыми в течение нескольких секунд.
- TopLeft и topRight перемещаются из центра экрана (родительского) к краям (TopLeft влево, topRight вправо).
- Когда TopLeft и topRight выполняют половину своего хода, bottomLeft и bottomRight перемещаются точно так же, как TopLeft и topRight на предыдущем шаге
- Когда все виды исчезают, oneBigView перемещается от левого края и заполняет экран.
- oneBigView остается на несколько секунд.
- oneBigView перемещается от центра к левому краю экрана.
- Когда oneBigView исчезает, все начинается сначала с 1.
Я пытался это сделать, но всегда что-то было не так:
- Я попытался добавить несколько анимаций перевода и изменить видимость (я попробовал View.НЕВИДИМЫЙ и VIEW.GONE) onAnimationEnd:
показать
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<translate
android:fromXDelta="-100%p"
android:toXDelta="0"
android:duration="500" />
</set>
скрыть
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<translate
android:fromXDelta="0"
android:toXDelta="-100%p"
android:duration="500" />
</set>
.java
final Animation leftIn=AnimationUtils.loadAnimation(this, R.anim.show);
final Animation leftOut=AnimationUtils.loadAnimation(this, R.anim.hide);
leftIn.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
//start animation for showing topRight bottomLeft and bottomRight
//with propper startOffset
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
left1.setVisibility(View.VISIBLE);
leftOut.setStartOffset(4000);
left1.startAnimation(leftOut);
}
});
leftOut.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
left1.setVisibility(View.INVISIBLE);
}
});
и так далее… Это отлично работало для видимости, но анимация была совсем не гладкой (большую часть времени это работает так, как будто я не использовал анимацию). Когда я перестал изменять видимость, анимация работает корректно, но она не выполняет свою работу.
Есть идеи?
Ответ №1:
Вы можете попробовать изменить альфа-значение представлений вместо того, чтобы делать его невидимым или исчезать.
Ответ №2:
Вам следует попробовать добавить fillAfter
к обоим вашим <set>
таким образом:
<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:fillAfter="true">
Настройка видимости с помощью View.INVISIBLE
и View.VISIBLE
обычно плохо работает с анимациями. Ваш единственный другой вариант — добавить альфа-анимацию к обоим <set>
. Вот шаблон:
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="200"
android:interpolator="@android:anim/accelerate_interpolator"/>
Настройте ее в соответствии с вашими потребностями. Избегайте настройки видимости.