Часть 2. Просмотр анимации
В части 1этой серии мы говорили о том, как создать различные виды анимации свойств. Во второй части мы используем анимации представлений для достижения этой же цели. Дополнительные сведения о настройке см. в первой части этой серии.
Содержание
- Просмотр анимации
a. Просмотр анимации (в составе набора или без)
b. Просмотр анимации в XML
c. Настраиваемая анимация
Просмотр анимации
Следующие способы создания анимации применяются в представлениях. Это может быть стандартное представление API Android или собственный настраиваемый класс представления. Обратите внимание, что при этом изменится только место отрисовки представления на экране, а не его фактическое расположение. Например, кнопка будет перемещаться по экрану, но область кнопки, поддерживающая нажатие указателем мыши, не будет перемещаться вместе с изображением. Это ограничение можно обойти, написав собственную настраиваемую анимацию и обновляя свойства вместо применения к объекту матрицы преобразований. Анимации представлений также используют реализацию интерфейса AnimationListener, чтобы можно было применять обратные вызовы вместо класса AnimationListenerAdapter, используемого в анимации свойств (в этом случае пришлось бы использовать все его методы, даже если они и не нужны).
a. Просмотр анимации (в составе набора или без)
Анимацию можно вкладывать в многоуровневую структуру или объединять в наборы. Это позволяет запустить одним вызовом просмотр сразу нескольких анимаций или их последовательности. Для вкладывания анимаций нужно задать значение true для параметра .setFillAfter, чтобы представление осталось в том состоянии, в котором оно было в конце первой анимации, а не возвращалось к начальной точке перед запуском следующей анимации. В приведенной здесь реализации мы делаем одну и ту же анимацию дважды, но во второй раз запускаем ее «задом наперед», задав значение 1 для счетчика повторов и значение reverse для режима повтора. Можно было бы и вложить эти анимации, но в данном случае описываемый подход предпочтительнее. Можно использовать повтор в обратном направлении для некоторых анимаций свойств, описанных в первой части; мы этого не сделали, чтобы не возникло путаницы с описываемыми здесь методиками. TranslateAnimation и другие анимации представлений отличаются тем, что используемые ими значения не являются абсолютными: величины изменений применяются в начале и в конце анимации. Поэтому мы сначала используем значение 0, чтобы оставаться на месте в начале анимации; а к ее концу нужно сдвинуться наполовину влево, поэтому используем значение x/2.
public void doViewAnimation(){ TranslateAnimation transTo= new TranslateAnimation(0, -mLittleChef.getX()/2, 0, 0); transTo.setRepeatCount(1); transTo.setRepeatMode(Animation.REVERSE); transTo.setAnimationListener(new Animation.AnimationListener(){ @Override public void onAnimationEnd(Animation animation) { simpleLock= false; } @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } }); transTo.setInterpolator(new LinearInterpolator()); transTo.setDuration(mShortAnimationDuration/2); mLittleChef.startAnimation(transTo); }Метод set анимации представления:
Также можно задать параметры анимации в XML-файле в папке res/anim. У этого подхода есть такие же недостатки, как у анимации объектов в XML, описанной в первой части этой серии: значения являются статическими, что затрудняет адаптацию к разным размерам экрана. Тем не менее, для анимации преобразований мы используем toXDelta, что дает нам возможность использовать значения, оканчивающиеся на % (процент от собственного значения) или на %p (процент от родительского значения). Это повышает удобство. Файл view_animation.xml в res/anim-xhdpi: Как было упомянуто в общем описании, для перемещения фактического представления (а не просто места отрисовки) можно создать собственную настраиваемую анимацию. Для этого мы переопределяем метод applyTransformation и используем setX для обновления значения с учетом интерполяции. Анимации представлений позволяют анимировать преобразование различных свойств представлений. Их можно определить индивидуально, в наборе или отдельно в XML-файле. Дальнейшие выпуски этой серии посвящены отображаемым объектам и полотну. http://developer.android.com/guide/topics/graphics/index.html Уитни Фостер (Whitney Foster) — инженер по программному обеспечению в подразделении Software Solutions Group корпорации Intel. Она занимается поддержкой крупномасштабных проектов, посвященных приложениям Android. *Прочие наименования и товарные знаки могут быть собственностью третьих лиц.
public void doViewAnimationSet(){
TranslateAnimation transTo= new TranslateAnimation(0, -mLittleChef.getX()/2, 0, 0);
TranslateAnimation transBack= new TranslateAnimation(0, mLittleChef.getX()/2, 0, 0);
transTo.setDuration(mShortAnimationDuration/2);
transBack.setDuration(mShortAnimationDuration/2);
transTo.setStartOffset(0);
transBack.setStartOffset(transTo.getDuration());
AnimationSet transSet= new AnimationSet(true);
transSet.setInterpolator(new LinearInterpolator());
transSet.addAnimation(transTo);
transSet.addAnimation(transBack);
transSet.setAnimationListener(new AnimationListener(){
@Override
public void onAnimationEnd(Animation animation) {
simpleLock= false;
}
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
});
mLittleChef.startAnimation(transSet);
//another way to start your set animation:
//set.setTarget(mLittleChef);
//set.start();
}
b. Просмотр анимации с помощью XML
public void doViewAnimationXML(){
Animation trans = AnimationUtils.loadAnimation(getActivity(), R.anim.view_animation);
trans.setRepeatCount(1);
trans.setRepeatMode(Animation.REVERSE);
trans.setAnimationListener(new AnimationListener(){
@Override
public void onAnimationEnd(Animation animation) {
simpleLock= false;
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
});
mLittleChef.startAnimation(trans);
}
<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXDelta="0"
android:toXDelta="-15%p"
android:interpolator="@android:anim/linear_interpolator"
/>
c. Настраиваемая анимация
public void doCustomAnimation(){
final Float startingPoint= mLittleChef.getX();
Animation animation = new Animation()
{
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
mLittleChef.setX(startingPoint - (int)(startingPoint/2 * interpolatedTime));
}
};
animation.setAnimationListener(new AnimationListener(){
@Override
public void onAnimationEnd(Animation animation) {
simpleLock= false;
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
});
animation.setInterpolator(new LinearInterpolator());
animation.setRepeatCount(1);
animation.setRepeatMode(Animation.REVERSE);
animation.setDuration(mShortAnimationDuration/2);
mLittleChef.startAnimation(animation);
}
Заключение
Справочные материалы
Часть 1, посвященная свойствам анимаций
Об авторе
**Пример исходного кода распространяется на условиях лицензионного соглашения корпорации Intel на использование образцов исходного кода.