кнопка Android не активируется во время воспроизведения анимации - PullRequest
6 голосов
/ 13 октября 2011

У меня есть кнопка, и пока эта кнопка воспроизводит анимацию, я не могу нажать на кнопку. Я установил прослушиватель щелчков и приемник касаний, но в режиме отладки он не входит в OnClick и в методы onTouch. Ты знаешь почему? Спасибо

изменить: я пробовал что-то вроде:

        AsyncTask task = new AsyncTask() {

        @Override
        protected Object doInBackground(Object... objects) {
            button1.setOnClickListener(new View.OnClickListener() {

                public void onClick(View view) {
                    Toast toast = Toast.makeText(MyActivity.this, button1.getText(), Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            return null;
        }

        ;
    };
    task.execute(button1);

но это не работает

Редактировать: вот полный исходный код

Ответы [ 6 ]

8 голосов
/ 17 октября 2011

До Android 3.0 использование любого из классов анимации изменяется только там, где рисуется представление - оно не будет корректировать свои границы касания во время (или после) анимации: http://android -developers.blogspot.com/2011/02/animation-in-honeycomb.html

Вы можете:

  • Создать группу ViewGroup, которая перемещает своих дочерних элементов каждый onDraw
  • Переопределить вашOnDraw представления для перемещения сам по себе - может использовать поле, отступ или положение (если представление находится в FrameLayout или что-то подобное).
  • Использовать только 3.0+ устройства
  • Переопределить родительский onTouch (или onInterceptTouchEvent), вычислите, где рисуется представление (вы можете узнать, как далеко и смещение от реальной позиции от анимации *) и соответственно обработать ... * Просмотр вашего кода (поскольку вы генерируете случайное направление каждый раз, когда он заканчивается), это может быть невозможно без отслеживания того, какие направления вы уже выбрали.
1 голос
/ 21 октября 2011

вы столкнулись с той же проблемой, что и я недавно ... когда вы применяете анимацию к кнопке или любому другому представлению и используете setFillAfter (True), это означает, что изображение представления перемещается, а не фактическое представление, поэтому его не слушают ваш слушатель щелчка, потому что это просто изображение, а не фактическое представление, вы должны сделать что-то подобное, что я объяснил в ответ на мой собственный вопрос в зависимости от вашей ситуации ... означает, что вы также должны переместить фактическое представление в конечное место анимации и используйте setFillAfter (false), чтобы при нажатии после анимации это был фактический вид, а не только изображение, используемое для анимации в Android

.

проверьте эту ссылку ....

EditText зависает после анимации и снова возвращается при прокрутке ......?

В вашем коде используйте setFillafter (false) и фактически поместите вашу кнопку в конечную позицию анимации, как-то так же, как установив поля или в соответствии с вашим макетом, используйте соответствующие свойства для размещения. Применяя эти изменения, ваш прослушиватель кликов будет работать отлично.

==> если вы пытаетесь, чтобы прослушиватель щелчков вашей кнопки работал во время ее перемещения (будучи анимированным), то, насколько я знаю, это невозможно, поскольку android использует только изображение вашего представления для выполнения анимации, а не фактической.

0 голосов
/ 17 октября 2011

Я бы поместил анимацию в асинхронную задачу, и тогда я думаю, что нажатие кнопки должно обрабатываться в основном потоке.Потому что сейчас вы делаете следующее: анимация запускается и блокирует основной поток.Это означает, что событие асинхронной задачи не может быть исключено

0 голосов
/ 17 октября 2011
I think there are two things

1) Вы можете обрабатывать одно событие за один раз для одного объекта. Как анимация воспроизводится на кнопке, это означает, что вы не можете нажимать на нее до тех пор, пока одна работа не будет завершена (насколько я понимаю, анимация находится на кнопке, а не в другой части). экрана)

2) Во-вторых, если у вас есть игра на оставшейся части экрана, и вы хотите остановить ее нажатием кнопки. Тогда я думаю, что это проблема фокуса. Только тогда установите onfoucslistener в кнопку и проверьте, что, когда вы щелкаете по ней, это получить фокус?

0 голосов
/ 13 октября 2011

Вы должны попытаться использовать AsyncTask .Программирование Android без него было бы и ужасной юзабилити серьезной проблемой.

См. Эту ссылку о том, как использовать асинхронную задачу.

Вот пример:

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Initialisation of the Activity 
        MyLongTask task = new MyLongTask();
        task.execute("http://blog.fr4gus.com/api/test.json");
    }

    @Override
    protected void onPause() {
        // If you wanna make something in the pause of the Asynctask
    }

    class MyLongTask extends AsyncTask<String, Void, Void>{

        @Override
        protected void onPreExecute() {
            // Before executing what you want to execute
        }

        @Override
        protected Void doInBackground(String... params) {
            // what you want to execute come here :D
            return null; // Or whatever you want pass to onPostExecute
        }

        @Override
        protected void onPostExecute(Void result) {
            // Here we can update for example the UI with something (who knows :? )
        }
    }

}

MODIFIED

Вы всегда должны расширять Asynctask Activity , так как вы пытаетесь передать через него параметры, вы должны определить их в заголовке вашего расширенного класса:

 class MyLongTask extends AsyncTask<String, Void, Void>{ ...

Затем первым является параметр doInBAckground, следующим является параметр onPreExecute, а последним - параметр onPostExecute.Таким образом, вы можете отправлять параметры как Button.

Подробнее о можно узнать здесь или по моей первой ссылке.

0 голосов
/ 13 октября 2011

Это может быть проблема с многопоточностью. Вы должны прочитать Поток отправки событий и как это сделать в асинхронном режиме Android, прочитав безболезненное создание потоков и взглянуть на AsyncTask JavaDoc .

Вкратце: основной поток не должен блокироваться, поскольку он используется для реагирования на события пользовательского интерфейса, такие как нажатия кнопок. Поэтому всякий раз, когда вы делаете что-то, что занимает больше нескольких миллисекунд, вы должны делать это асинхронно в другом потоке.

...