Невозможно отменить () анимацию (объект нулевой)

Я пытаюсь бесконечно анимировать (поворачивать) ImageView в событии Button onClick, а затем останавливать его на другой кнопке onClick. Вот мой код...

public class MainActivity extends Activity{

ObjectAnimator animation;

public void onCreate(Bundle icicle) {
...

Button start = (Button) findViewById(R.id.startbutton);
start.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        ImageView iv = (ImageView) findViewById(R.id.wheel);
        ObjectAnimator animation = ObjectAnimator.ofFloat(iv, "rotation", 360);
        animation.setInterpolator(null);
        animation.setRepeatCount(animation.INFINITE);
        animation.setDuration(1000);
        animation.start();

        Log.i(TAG, String.valueOf(animation)); // returns the animation object

    }
});

Button stop = (Button) findViewById(R.id.stopbutton);
stop.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {

        Log.i(TAG, String.valueOf(animation)); // returns null

        animation.cancel();
    }
});

Анимация запускается и работает нормально. Однако приложение аварийно завершает работу, когда нажимается кнопка остановки, поскольку объект «анимация» выглядит нулевым.


person DaddyBadger    schedule 20.11.2014    source источник
comment
Как указано Pavol Celuch, ваша переменная анимации всегда имеет значение null, когда доступ осуществляется нажатием кнопки остановки.   -  person Jibяaᴎ Khaᴎ    schedule 20.11.2014


Ответы (4)


Это проблема области действия - у вас есть локальная переменная метода и глобальная переменная с одним и тем же именем. Вам нужно вынуть другую декларацию:

EX:

public class MainActivity extends Activity{

ObjectAnimator animation;

public void onCreate(Bundle icicle) {
...

Button start = (Button) findViewById(R.id.startbutton);
start.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        ImageView iv = (ImageView) findViewById(R.id.wheel);

        //remove declaration here so it uses the globally scoped variable
        animation = ObjectAnimator.ofFloat(iv, "rotation", 360);
        animation.setInterpolator(null);
        animation.setRepeatCount(animation.INFINITE);
        animation.setDuration(1000);
        animation.start();

        Log.i(TAG, String.valueOf(animation)); // returns the animation object

    }
});

Button stop = (Button) findViewById(R.id.stopbutton);
stop.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {

        Log.i(TAG, String.valueOf(animation)); // returns null
        if(animation != null) //you'll probably wana do a null check
            animation.cancel();
    }
});
person Submersed    schedule 20.11.2014
comment
Спасибо, Погруженный! Я новичок в разработке Android и Java, но до сих пор не понимаю, как я это пропустил! - person DaddyBadger; 20.11.2014

Используйте animation.dismiss() вместо animation.cancel();

person IntelliJ Amiya    schedule 20.11.2014
comment
Плюс один за простоту ответа. - person Geeky Guy; 20.11.2014

Объект ObjectAnimator animation доступен только в методе onClick для кнопки запуска. У вас нет ссылки на него позже.

person ThePavolC    schedule 20.11.2014

Переместите инициализацию переменной анимации в onCreate и попробуйте animation.dismiss() при нажатии кнопки остановки.

public class MainActivity extends Activity{

    ObjectAnimator animation;

    public void onCreate(Bundle icicle) {

    animation = ObjectAnimator.ofFloat(iv, "rotation", 360);
person Jibяaᴎ Khaᴎ    schedule 20.11.2014