a13xsus
@a13xsus
Lazy developer

Как заставить работать анимацию после клика на Button?

Есть простая анимация AnimationDrawable из двух кадров в gradient_animation.xml:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/gradient_box" android:duration="200" />
    <item android:drawable="@drawable/gradient_box_end" android:duration="200" />
</animation-list>


gradient_box и gradient_box_end - это шейпы, которые отличаются только длиной width (280 и 180dp):

<?xml version="1.0" encoding="UTF-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
	<size
		android:width="280dp"
		android:height="50dp"/>
    <gradient
        android:startColor="#FF3366"
        android:endColor="#FF3366"
        android:angle="180"/>
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners android:radius="35dp" />
</shape>


Соответственно кнопке назначен android:background="@drawable/gradient_animation"

В mainactivity.cs:

protected override void OnCreate(Bundle savedInstanceState)
		{
			base.OnCreate(savedInstanceState);

			SetContentView(Resource.Layout.Main);

			Button buttonlogin = FindViewById<Button>(Resource.Id.button1); //кнопка, которая анимируется при клике на саму себя
			AnimationDrawable animation = (AnimationDrawable)buttonlogin.Background;


			buttonlogin.Click += (sender, e) =>
			{
				animation.Start();
			};


Задумка такова, что width кнопки после клика по самой кнопке должна меняться c 280 на 180 dp. Собственно сама анимация запускается, но запускается не сразу после клика на кнопке, а лишь после того, как приложение снова получит фокус. То есть, я кликаю на кнопку, ничего не происходит, затем я к примеру кликаю на текстовом поле, выезжает клавиатура и за ней видно, что кнопка поменяла width, то есть анимация сработала, но после какого-то действия с приложением.

Как заставить работать анимацию сразу? Поиски натолкнули на решения с Runnable, с Thread, с отдельным классом, с RunnableAnonymousInnerClassHelper (гугл пишет, что запускать анимацию следует не в OnCreate методе, а в onWindowFocusChanged). Но ни по одному способу реализовать не получилось - если делать в отдельном классе, то при клике вылетает NullPointerException.
  • Вопрос задан
  • 613 просмотров
Пригласить эксперта
Ответы на вопрос 1
с этим какие проблемы возникли?onWindowFocusChanged
Можно подробнее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы