Есть простая анимация 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.