Итак, я оживляю вид с использованием анимации:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator" >
<translate
android:duration="1000"
android:fromYDelta="0%"
android:toYDelta="-75%" />
</set>
Это визуально то, что я хочу, но я также хочу заморозить результат этой анимации. Как мне нужно как-то получить результирующие параметры макета (или что-то еще?) После анимации и установить его в макет. Предположим, что Y-координата меняется от 0 до 100, но я действительно не знаю, что начиналось с коордов и в результате были созданы коорды. Мне нужно получить результирующие координаты и установить его в макет, потому что если бы не сделать, макет вернется в исходное положение после анимации, но мне нужно заставить его остаться в новой позиции, а не возвращаться обратно. Также мне нужно решение 2.3.x.
ОБНОВЛЕНИЕ 1
Я также попробовал NineOldAndroids:
ObjectAnimator.ofFloat(rootWrapper, "translationY", -rootWrapper.getHeight()*75/100).start();
это оживляет вид и просмотр остается на анимированной позиции - именно этого я и хочу достичь.
Однако все элементы управления практически находятся на своих позициях. Даже ваш макет отображается только на 25% его нижней части, а 75% экрана останова выглядит пустым, если я коснусь этой пустой области экрана, а затем кнопки (которая была там b4-анимация) onClick. То же самое происходит с xml-animaions, если установлено
animation.setFillAfter(true);
Как исправить эту проблему? Все элементы управления должны перемещаться с видом.
ОБНОВЛЕНИЕ 2
Код:
public void showAbout(){
final Animation animShow = AnimationUtils.loadAnimation(this, R.anim.about_in_from_bottom);
animShow.setFillAfter(true);
//ObjectAnimator.ofFloat(rootWrapper, "translationY", -rootWrapper.getHeight()*75/100).start();
animShow.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {
LinearLayout.LayoutParams rootlp = (LinearLayout.LayoutParams) rootWrapper.getLayoutParams();
Log.i(this,"rootlp: h: "+rootlp.topMargin+ " / w: "+rootlp.bottomMargin);
rootlp.topMargin = -rootlp.height*75/100;
rootWrapper.setLayoutParams(rootlp);
}
});
rootWrapper.startAnimation(animShow);
}
У меня возникла проблема - rootlp.height
возвращает 0, потому что это похоже на MATCH_PARENT или подобное. Он не вернет РЕАЛЬНЫЕ пиксели, а некоторое значение, представляющее некоторую константу! Так что, похоже, у меня 2 игры с .getViewTreeObserver().addOnGlobalLayoutListener
.
Хорошо, я получил реальную высоту rootWrapper через getViewTreeObserver(). И теперь, используя формулу rootlp.topMargin = -rootlp.height*75/100;
, я получаю еще больше проблем.
1) После анимации View перемещается вверх (из-за установки LP).
2) Элементы управления, которые поддерживает анимированный вид (кнопки, которые должны перемещаться вверх с родительским представлением) остаются на своих позициях практически (они невидимы, но доступны для кликов)! Визуально эти элементы управления перемещаются вверх с анимированным представлением, и я не могу его достичь (он отключается от экрана). Но если я коснусь области, где они были до анимации, соответствующие триггеры onClick()! Какая радость!
ОБНОВЛЕНИЕ 3
Наконец, я достиг своей цели! Проблема заключалась в перемещении дочерних контейнеров View. Я думал, что если я переведу некоторый вид, все его детские представления также будут перемещаться. Но это не так, и мне пришлось перемещать дочерние представления вручную после завершения анимации, чтобы исправить призрачные кнопки.