Кнопка не работает после анимации андроида
Я создал представление в Android, и мне нужно анимировать его снизу вверх и наоборот. Мне удалось сделать это с помощью TranslateAnimation. Но проблема в том, что у меня есть несколько кнопок на виде. Когда анимированная там точка касания остается в исходном месте и не перемещается в новую позицию. Поэтому, когда я снова нажимаю на исходное положение кнопки, запускается анимация сверху вниз, но кнопки там нет.
Я искал в интернете, и люди говорят, что вызовите view.layout с параметрами, но мой вопрос заключается в том, как получить последнюю позицию представления, потому что я попытался получить положение о начале и конце анимации, и оно остается неизменным.
Также, пожалуйста, не дайте ответа, что он фактически не перемещает представление, он создает копию и перемещает ее и т. Д. И т. Д., Потому что я искал, но не смог найти правильное решение, описанное или реализованное.
Вот код:
import android.content.Context;
import android.graphics.Matrix;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.Transformation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import com.Card_Android.R;
public class GameMenuScreenAnimated extends LinearLayout {
private final View mainView;
public GameMenuScreenAnimated(Context context,
final GameViewController dashboardVC) {
super(context);
LayoutInflater inflater = LayoutInflater.from(context);
mainView = inflater.inflate(R.layout.main_menu, this);
ImageButton btn = (ImageButton) mainView.findViewById(R.id.trade);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("yaaaaaay!!!!");
}
});
slideDown(mainView);
}
public View getMainView() {
return mainView;
}
private void slideUp(final View view) {
Animation slide = new TranslateAnimation(Animation.RELATIVE_TO_SELF,
0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,
0.5f);
slide.setDuration(1000);
slide.setFillAfter(true);
slide.setFillEnabled(true);
view.startAnimation(slide);
slide.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
int[] startPosition = new int[2];
view.getLocationOnScreen(startPosition);
System.out.println("onAnimationStart " + startPosition[0]
+ " , " + startPosition[1]);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
int[] endPosition = new int[2];
view.getLocationOnScreen(endPosition);
System.out.println("onAnimationEnd " + endPosition[0] + " , "
+ endPosition[1]);
}
});
}
private final AnimationListener slideDownAnimationListener = new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
final int left = mainView.getLeft();
final int top = mainView.getTop();
final int right = mainView.getRight();
final int bottom = mainView.getBottom();
mainView.layout(left, (int) Math.round(top + 0.25 * top), right,
(int) Math.round(bottom + 0.25 * bottom));
}
};
private final Animation slideDownAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.25f);
private void slideDown(final View view) {
slideDownAnimation.setDuration(1000);
slideDownAnimation.setFillAfter(true);
slideDownAnimation.setFillEnabled(true);
slideDownAnimation.setAnimationListener(slideDownAnimationListener);
view.startAnimation(slideDownAnimation);
}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="bottom"
>
<LinearLayout
android:id="@+id/tableLayout1"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center"
>
<ImageButton
android:id="@+id/trade"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="0dp"
android:background="@null"
android:scaleType="centerCrop"
android:src="@drawable/upgrade_btn" />
</LinearLayout>
<LinearLayout
android:id="@+id/tableLayout1"
android:layout_width="fill_parent"
android:gravity="center"
android:layout_height="wrap_content"
>
<ImageButton
android:id="@+id/evolution"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="0dp"
android:background="@null"
android:scaleType="centerCrop"
android:src="@drawable/sell_btn" />
<ImageButton
android:id="@+id/trade"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="0dp"
android:background="@null"
android:scaleType="centerCrop"
android:src="@drawable/upgrade_btn"
/>
</LinearLayout>
</LinearLayout>
Drawable XML
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/evolution">
<item android:state_pressed="true" android:drawable="@drawable/menu_off" /> <!-- pressed -->
<item android:state_focused="true" android:drawable="@drawable/menu_on" /> <!-- focused -->
<item android:drawable="@drawable/menu_on" /> <!-- default -->
</selector>
Все, что я хочу сделать, это создать простое меню с несколькими кнопками, которые скользят по нажатию кнопки.
1 ответ
Простое решение: просто используйте AnimationListener и используйте.clearAnimation().
Animation animationLeft= AnimationUtils.loadAnimation(getContext(), R.anim.slide_right);
animationLeft.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
imageView.clearAnimation();//This Line Added
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
Я столкнулся с той же проблемой некоторое время назад. Вы найдете мой ответ здесь:
Как я могу применить изменения к позиции представления после анимации?
Другой способ - использовать функцию animate() или ObjectAnimator. Оба эти способа анимации влияют на сам объект-вид, вместо того, чтобы анимировать только пиксели на экране без обновления внутренних значений местонахождения вида. Вы найдете больше информации об этих функциях здесь:
animate() (он же ViewPropertyAnimator): http://developer.android.com/guide/topics/graphics/prop-animation.html
ObjectAnimator: http://developer.android.com/guide/topics/graphics/prop-animation.html
Вся глава "Анимация" очень хорошо читается. Это займет, может быть, 20 минут, но после этого у вас будет намного лучшее представление о том, что происходит с анимацией на Android.
Мне не удалось найти проблему, заключающуюся в том, что для применения анимации при нажатии кнопки на той же самой кнопке кнопка не может быть нажата второй раз, однако разработчик.android говорит: анимация просмотра не изменяет границы анимированного представления, она только анимирует представления (внешний вид), но, на мой взгляд, в случае кнопок он меняет границы. Я проверил это на масштабной анимации. Мне удалось добавить несколько масштабных анимаций с помощью аниматора свойств представления и сбросить границы моих кнопок, вызвав: button1.setScaleX(1f); и button1.setScaleY(1f); а для анимации создал такой метод:
private void propScaleDownAnim(Button btn, int startDly){
btn.animate().scaleX(0f).scaleY(0f).setDuration(250).setStartDelay(startDly)
.withEndAction(new Runnable() {
@Override
public void run() {
//animation ended
btn.setVisibility(View.INVISIBLE);
}
}); }