но вот о шубе речь не шла.
410013796724260
• Webmoney
R335386147728
Z369087728698
Анимация View без XML описанияДанная статья продолжает описание процесса анимации View компонентов. В предыдущей статье параметры трансформации компонентов описывались в XML файле. Сейчас мы рассмотрим процесс анимации без использования XML файла. Для этого будем использовать наследники класса Animation. Но прежде чем переходить к описанию наследников рассмотрим слушателя AnimationListener класса анимации Animation, включающего методы, вызываемые :
Пример AnimationListenerВ следующем примере слушатель анимации ничего полезного не делает, просто выводит сообщения в консоль. У нас же в примере, который мы рассмотрим далее, этот слушатель будет зеркально повторять процесс перехода из одного состояния в другое. Так, например, при анимации масштабированием компонент сначала будет уменьшаться в размерах, а потом восстанавливаться. Процесс уменьшения и восстановления будем привязывать к методу onAnimationEnd. Можно, конечно же, привязать и к методу onAnimationStart. Здесь самое главное определиться с началом анимации, т.е. из какого «состояния» компонента будем стартовать процесс анимации.
Context context = MainActivity.this;
Animation a;
a = AnimationUtils.loadAnimation(context, R.anim.alpha);
a.setAnimationListener(new AnimationListener ()
{
@Override
public void onAnimationStart(Animation animation) {
System.out.println("animation start");
}
@Override
public void onAnimationEnd(Animation animation) {
System.out.println("animation end");
}
@Override
public void onAnimationRepeat(Animation animation) {
System.out.println("animation repeat");
}
});
В статье рассматриваются следующие классы анимации View компонентов, наследующие свойства Animation :
Анимация прозрачностью, класс AlphaAnimationКласс AlphaAnimation имеет два конструктора : AlphaAnimation(Context context, AttributeSet attrs); AlphaAnimation(float fromAlpha, float toAlpha); Первый конструктор используется для создания объекта анимации с загрузкой ресурсов. Бо́льшее распространение получил второй конструктор, в котором параметры fromAlpha и toAlpha определяют соответственно начальное и конечное значение прозрачности (от 0.0 до 1.0). В следующем примере анимация изменяет прозрачность компонента от 0.2 до 1.0 в течение 3-х секунд. AlphaAnimation mAlphaAnimation; mAlphaAnimation = new AlphaAnimation(0.2f, 1.0f); mAlphaAnimation.setDuration(3000); mView.startAnimation(mAlphaAnimation); Анимация масштабированием, класс ScaleAnimationКласс ScaleAnimation имеет 4 конструктора :
ScaleAnimation (Context context, AttributeSet attrs);
ScaleAnimation (float fromX, float toX,
float fromY, float toY);
ScaleAnimation (float fromX, float toX,
float fromY, float toY,
float pivotX, float pivotY);
ScaleAnimation (float fromX, float toX,
float fromY, float toY,
int pivotXType, float pivotXValue,
int pivotYType, float pivotYValue);
Первый конструктор используется для создания объекта анимации с загрузкой ресурсов. В других конструкторах используются параметры fromX, toX, fromY, toY, pivotX, pivotY, описанные в предыдущей статье. Назначение параметров pivotXType, pivotXValue, pivotYType, pivotYValue следующее :
В следующем примере анимация масштабированием увеличивает размер компонента с 10% до 100% в течение 3-х секунд. Центр, относительного которого выполняется масштабирование, находится в точке (0.05, 0.05).
ScaleAnimation mScaleAnimation;
mScaleAnimation = new ScaleAnimation(0.1f, 1.0f, 0.1f, 1.0f,
0.05f, 0.05f);
mScaleAnimation.setDuration(3000);
mView.startAnimation(mScaleAnimation);
Анимация перемещением, класс TranslateAnimationКласс TranslateAnimation имеет 3 конструктора :
TranslateAnimation (Context context, AttributeSet attrs);
TranslateAnimation (float fromXDelta, float toXDelta,
float fromYDelta, float toYDelta);
TranslateAnimation (int fromXType , float fromXValue,
int toXType , float toXValue ,
int fromYType , float fromYValue,
int toYType , float toYValue );
Первый конструктор используется для создания объекта анимации с загрузкой ресурсов. В двух других конструкторах определяются значения начального и конечного положений компонентов. При этом в последнем конструкторе для каждого параметра указывается его формат. В следующем примере анимация перемещением изменяет положение компонента в течение 3-х секунд. Первоначальное положение компонента смещено относительно конечного на -150 пикселей по оси X и на -200 пикселей по оси Y. TranslateAnimation mAnimation; mAnimation = new TranslateAnimation(-150.0f, 0.0f, -200.0f, 0.0f); mAnimation.setDuration(3000); mView.startAnimation(mAnimation); Анимация вращением, класс RotateAnimationКласс RotateAnimation имеет 4 конструктора :
RotateAnimation (Context context, AttributeSet attrs);
RotateAnimation (float fromDegrees, float toDegrees);
RotateAnimation (float fromDegrees, float toDegrees,
float pivotX, float pivotY);
RotateAnimation (float fromDegrees, float toDegrees,
int pivotXType, float pivotXValue,
int pivotYType, float pivotYValue);
Первый конструктор используется для создания объекта анимации с загрузкой ресурсов. В остальных конструкторах параметры fromDegrees и toDegrees определяют начальный и конечный углы поворота. Параметры pivotX и pivotY определяют координаты центра поворота в пикселях относительно левой и верхней границы элемента. В последнем конструкторе параметры pivotXType, pivotXValue, pivotYType, pivotYValue имеют такие же значения, как и в классе ScaleAnimation. Комбинированная анимация, класс AnimationSetКласс AnimationSet имеет 2 конструктора : AnimationSet (Context context, AttributeSet attrs); AnimationSet (boolean shareInterpolator); Первый конструктор используется для создания объекта анимации с загрузкой ресурсов. Во втором конструкторе используется параметр shareInterpolator, определяющий признак общего (для набора анимации) интерполятора или каждая анимация использует свой интерполятор. В первом случае значение равно «true», во втором случае «false». Вопрос использования интерполяторов в анимации View компонентов рассмотрен отдельно. Для добавления в набор анимации необходимо использовать метод addAnimation класса AnimationSet. В следующем примере создается объект комбинированной анимации mAnimation без использования интерполятора. В набор анимации добавляются объекты анимации прозрачностью mAlphaAnimation и масштабированием mScaleAnimation, рассмотренные выше.
AnimationSet mAnimation;
mAnimation = new AnimationSet(false);
mAnimation.addAnimation(mAlphaAnimation);
mAnimation.addAnimation(mScaleAnimation);
mView.startAnimation(mAnimation);
Пример использования класса анимацииРассмотрим пример анимации View-компонентов с использованием описанных выше классов анимации. Новый модуль/проект создавать не будем, а воспользуемся описанным в предыдущей статье модулем p04Animation, в котором внесем изменения только в активность MainActivity.java. То есть весь интерфейс с кнопками оставим без изменений, а обработчики нажатий на кнопки изменим. При этом, в пример включим слушатели событий, чтобы выполнять зеркальные процессы анимации. Для этого для каждого типа анимации будем создавать по 2 объекта. Один объект будет изменять исходное состояние, а другой объект будет восстанавливать исходное состояние. Нам необходимо :
Объявление переменныхПри объявлении переменных для каждого типа анимации определяем по два объекта. Объекты с постфиксом «In» будут восстанавливать исходное состояние объекта. Объекты с постфиксом «Out» будут изменять исходное состояние объекта. Что касается анимации вращением, то объект mRotateAhead будет вращать компонент по часовой стрелке, а объект анимации mRotateBackward – против часовой стрелки. Слушатели outListener, inListener будут использоваться для повторного старта соответствующего процесса анимации. TextView mView; AlphaAnimation mFadeIn , mFadeOut ; ScaleAnimation mScaleIn , mScaleOut ; TranslateAnimation mTransIn , mTransOut ; AnimationSet mComboIn , mComboOut ; RotateAnimation mRotateAhead, mRotateBackward; Animation.AnimationListener outListener ; Animation.AnimationListener inListener ; boolean mAlpha, mScale, mTrans, mRotate, mCombo; Логические переменные будут использоваться для определения вида анимации. При нажатии на кнопку в соответствующей переменной будет установлено логическое значение "true", после чего начнется анимация. И продолжаться анимация будет до тех пор, пока повторным нажатием эту кнопку значение переменной не сбросится в "false". Листинг метода onClickВ методе onClick определяется идентификатор компонента (кнопки). Для нажатой кнопки устанавливается (true) или сбрасывается (false) соответствующий флаг (логическая переменная). Если флаг установлен, то стартует анимация, связанная с изменением текущего состояния. Процесс анимации, связанный с восстановлением текущего состояния, будет стартован из слушателя. Анимация вращением выполняет повороты в разные стороны.
@Override
public void onClick(View v)
{
switch (v.getId()) {
case R.id.btnAlpha:
mAlpha = !mAlpha;
if (mAlpha)
mView.startAnimation(mFadeOut);
break;
case R.id.btnScale:
mScale = !mScale;
if (mScale)
mView.startAnimation(mScaleOut);
break;
case R.id.btnTrans:
mTrans = !mTrans;
if (mTrans)
mView.startAnimation(mTransOut);
break;
case R.id.btnRotate:
mRotate = !mRotate;
if (mRotate)
mView.startAnimation(mRotateBackward);
break;
case R.id.btnCombo:
mCombo = !mCombo;
if (mCombo)
mView.startAnimation(mComboOut);
break;
}
}
Примечание : в методе нет проверки параллельного старта нескольких анимаций. Полагаю, что, при необходимости, Вы можете это выполнить самостоятельно. Листинг слушателейВ примере определяем двух слушателей : outListener, inListener. В каждом из слушателей будем использовать метод, вызываемый при завершении анимации onAnimationEnd. Cлушатель ouListener будет стартовать анимацию восстановления состояния компонента, а слушатель inListener – анимацию изменения исходного состояния. При выборе, какую анимацию стартовать, выполняется проверка установленного флага.
outListener = new Animation.AnimationListener() {
@Override
public void onAnimationEnd(Animation animation) {
if (mAlpha)
mView.startAnimation(mFadeIn);
else if (mScale)
mView.startAnimation(mScaleIn);
else if (mTrans)
mView.startAnimation(mTransIn);
else if (mRotate)
mView.startAnimation(mRotateAhead);
else if (mCombo)
mView.startAnimation(mComboIn);
}
@Override
public void onAnimationRepeat(Animation animation) {}
@Override
public void onAnimationStart(Animation animation) {}
};
inListener = new Animation.AnimationListener() {
@Override
public void onAnimationEnd(Animation animation) {
if (mAlpha)
mView.startAnimation(mFadeOut);
else if (mScale)
mView.startAnimation(mScaleOut);
else if (mTrans)
mView.startAnimation(mTransOut);
else if (mRotate)
mView.startAnimation(mRotateBackward);
else if (mCombo)
mView.startAnimation(mComboOut);
}
@Override
public void onAnimationRepeat(Animation animation) {}
@Override
public void onAnimationStart(Animation animation) {}
};
Листинг метода onCreate класса MainActivityВ заключение рассмотрим метод onCreate класса MainActivity. В первой части метода ничего не изменилось : к каждой кнопке подключается обработчик события. А вот во второй части метода создаются объекты анимации, определяются их параметры и подключаются слушатели событий. Последними создаются комбинированные объекты анимации, которые включают в свой набор по два ранеее созданных объекта анимации.
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mView = findViewById(R.id.tv);
Button btnAlpha = findViewById(R.id.btnAlpha);
btnAlpha.setOnClickListener(this);
Button btnScale = findViewById(R.id.btnScale);
btnScale.setOnClickListener(this);
Button btnTrans = findViewById(R.id.btnTrans);
btnTrans.setOnClickListener(this);
Button btnRotate = findViewById(R.id.btnRotate);
btnRotate.setOnClickListener(this);
Button btnCombo = findViewById(R.id.btnCombo);
btnCombo.setOnClickListener(this);
//-----------------------------------------------------
mFadeIn = new AlphaAnimation(0.2f, 1.0f);
mFadeOut = new AlphaAnimation(1.0f, 0.2f);
mFadeIn .setDuration(2000);
mFadeOut.setDuration(1500);
mFadeIn .setAnimationListener(inListener );
mFadeOut.setAnimationListener(outListener);
//-----------------------------------------------------
mScaleIn = new ScaleAnimation(0.2f, 1.0f, 0.1f, 1.0f,
0.05f, 0.05f);
mScaleOut = new ScaleAnimation(1.0f, 0.2f, 1.0f, 0.2f,
0.05f, 0.05f);
mScaleIn .setDuration(3000);
mScaleOut.setDuration(3000);
mScaleIn .setAnimationListener(inListener );
mScaleOut.setAnimationListener(outListener);
//-----------------------------------------------------
mTransIn = new TranslateAnimation(-150.0f, 0.0f,
-200.0f, 0.0f);
mTransOut = new TranslateAnimation(0.0f, 150.0f,
0.0f, -200.0f);
mTransIn .setDuration(3000);
mTransOut.setDuration(2500);
mTransIn .setAnimationListener(inListener );
mTransOut.setAnimationListener(outListener);
//-----------------------------------------------------
mRotateAhead = new RotateAnimation(0.0f, 360.0f);
mRotateBackward = new RotateAnimation(0.0f,-360.0f);
mRotateAhead .setDuration(3000);
mRotateBackward.setDuration(3000);
mRotateAhead .setAnimationListener(inListener );
mRotateBackward.setAnimationListener(outListener);
//-----------------------------------------------------
mComboIn = new AnimationSet(false);
mComboOut = new AnimationSet(false);
mComboIn .setAnimationListener(inListener );
mComboOut.setAnimationListener(outListener);
mComboIn .addAnimation(mFadeIn );
mComboIn .addAnimation(mScaleIn );
mComboOut.addAnimation(mFadeOut );
mComboOut.addAnimation(mScaleOut);
}
На этом всё. Полагаю, анимация View компонентов на этих примерах освоена Вами в достаточном объеме. Связанные страницы
Пример создания проекта Android |
