#android #animation #reset #translate-animation
#Android #Анимация #Сброс #перевести-анимация
Вопрос:
Я пытаюсь анимировать кнопку ImageButton. Когда нажата кнопка, я хочу, чтобы она сдвинулась вправо. При повторном нажатии на нее она должна вернуться в исходное положение.
Когда анимация заканчивается, она возвращается в исходное положение, поэтому я перемещаю кнопку ImageButton. У меня есть небольшая «вспышка», в которой и кнопка изображения, и анимация находятся в исходном положении до того, как кнопка изображения была перемещена. Кто-нибудь может сказать мне, как избавиться от этой «вспышки»?
Я написал следующий код для запуска анимации, а когда анимация закончится, переместите саму кнопку ImageButton. Что это такое, это OnClickListener для перемещения кнопки ImageButton и AnimationListener для этого. Также есть OnClickListener и AnimationListener для перемещения кнопки ImageButton назад.
private class SceneIndicatorListenerIn implements ImageButton.OnClickListener {
ImageButton imageButton;
public SceneIndicatorListenerIn (ImageButton imageButton) {
this.imageButton = imageButton;
}
@Override
public void onClick(View view) {
// Create animation
Animation anim = AnimationUtils.loadAnimation(context, R.anim.sceneindicator_in);
anim.setAnimationListener(new SceneIndicatorListenerInDidEnd(imageButton));
view.startAnimation(anim);
}
}
private class SceneIndicatorListenerInDidEnd implements AnimationListener {
ImageButton imageButton;
public SceneIndicatorListenerInDidEnd (ImageButton imageButton) {
this.imageButton = imageButton;
}
@Override
public void onAnimationEnd(Animation anim) {
Log.d(LOG_TAG, "In animation did end");
// This is for density pixels
float dp = context.getResources().getDisplayMetrics().density;
// Keep position after animation
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(imageButton.getWidth(), imageButton.getHeight());
params.setMargins((int) (0 * dp), imageButton.getTop(), 0, 0);
imageButton.setLayoutParams(params);
// Change on click listener
imageButton.setOnClickListener(new SceneIndicatorListenerOut(imageButton));
}
@Override
public void onAnimationRepeat(Animation arg0) {}
@Override
public void onAnimationStart(Animation arg0) {}
}
private class SceneIndicatorListenerOut implements ImageButton.OnClickListener {
ImageButton imageButton;
public SceneIndicatorListenerOut (ImageButton imageButton) {
Log.d(LOG_TAG, "My imageButton was set");
this.imageButton = imageButton;
}
@Override
public void onClick(View view) {
Log.d(LOG_TAG, "You clicked me");
// Create animation
Animation anim = AnimationUtils.loadAnimation(context, R.anim.sceneindicator_out);
anim.setAnimationListener(new SceneIndicatorListenerOutDidEnd(imageButton));
view.startAnimation(anim);
}
}
private class SceneIndicatorListenerOutDidEnd implements AnimationListener {
ImageButton imageButton;
public SceneIndicatorListenerOutDidEnd (ImageButton imageButton) {
this.imageButton = imageButton;
}
@Override
public void onAnimationEnd(Animation anim) {
Log.d(LOG_TAG, "Out animation did end");
// This is for density pixels
float dp = context.getResources().getDisplayMetrics().density;
// Keep position after animation
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(imageButton.getWidth(), imageButton.getHeight());
params.setMargins((int) (-199 * dp), imageButton.getTop(), 0, 0);
imageButton.setLayoutParams(params);
// Change on click listener
imageButton.setOnClickListener(new SceneIndicatorListenerIn(imageButton));
}
@Override
public void onAnimationRepeat(Animation arg0) {}
@Override
public void onAnimationStart(Animation arg0) {}
}
Это моя анимация для скольжения в:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0%"
android:toXDelta="83%"
android:duration="750" />
</set>
И это моя анимация для скольжения назад:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0%"
android:toXDelta="-80%"
android:duration="750" />
</set>
Ответ №1:
У меня была такая же проблема, и я хотел опубликовать ответ для всех, кто сталкивается с этим. Существует ошибка, которая вызывает это независимо от того, что вы установили в xml или иным образом.
Способ, которым я обошел это, состоял в том, чтобы вручную установить местоположение X за пределами экрана перед анимацией, чтобы вспышка происходила за пределами экрана, затем она будет возвращена в исходное положение, поскольку обрабатывается анимацией.
image.setX(-5000);//Really any number off of the screen will do
Animation animation0 = AnimationUtils.loadAnimation(this,
R.anim.slide_across_right);
animation0.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
animationHack();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
});
private void animationHack() {
(new Handler()).postDelayed(new Runnable() {
public void run() {
image.setX(0);
}
}, 20);
}