Quantcast
Channel: Статьи Intel Developer Zone
Viewing all articles
Browse latest Browse all 133

Серия «Двухмерная анимация для Android*»: сравнение различных способов выполнения одной анимации

$
0
0

Часть 2. Просмотр анимации

В части 1этой серии мы говорили о том, как создать различные виды анимации свойств. Во второй части мы используем анимации представлений для достижения этой же цели. Дополнительные сведения о настройке см. в первой части этой серии.

Содержание

  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 анимации представления:


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

Также можно задать параметры анимации в XML-файле в папке res/anim. У этого подхода есть такие же недостатки, как у анимации объектов в XML, описанной в первой части этой серии: значения являются статическими, что затрудняет адаптацию к разным размерам экрана. Тем не менее, для анимации преобразований мы используем toXDelta, что дает нам возможность использовать значения, оканчивающиеся на % (процент от собственного значения) или на %p (процент от родительского значения). Это повышает удобство.

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);
}

Файл view_animation.xml в res/anim-xhdpi:

<?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. Настраиваемая анимация

Как было упомянуто в общем описании, для перемещения фактического представления (а не просто места отрисовки) можно создать собственную настраиваемую анимацию. Для этого мы переопределяем метод applyTransformation и используем setX для обновления значения с учетом интерполяции.

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);
}

Заключение

Анимации представлений позволяют анимировать преобразование различных свойств представлений. Их можно определить индивидуально, в наборе или отдельно в XML-файле. Дальнейшие выпуски этой серии посвящены отображаемым объектам и полотну.

Справочные материалы

http://developer.android.com/guide/topics/graphics/index.html

Часть 1, посвященная свойствам анимаций

https://software.intel.com/en-us/articles/2d-animation-for-android-series-comparing-and-contrasting-different-ways-of-doing-the-same

Об авторе

Уитни Фостер (Whitney Foster) — инженер по программному обеспечению в подразделении Software Solutions Group корпорации Intel. Она занимается поддержкой крупномасштабных проектов, посвященных приложениям Android.

*Прочие наименования и товарные знаки могут быть собственностью третьих лиц.
**Пример исходного кода распространяется на условиях лицензионного соглашения корпорации Intel на использование образцов исходного кода.


Viewing all articles
Browse latest Browse all 133

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>