播放动画时,android按钮无法点击

时间:2011-10-13 19:31:57

标签: android animation button clickable

我有一个按钮,当这个按钮正在播放动画时,我无法点击按钮。我设置了单击侦听器和触摸侦听器,但在调试模式下,它没有进入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);

但它不起作用

编辑:这是完整的source code

6 个答案:

答案 0 :(得分:8)

在Android 3.0之前,使用任何动画类只会更改绘制视图的位置 - 它不会在动画期间(或之后)调整其可触摸边界: http://android-developers.blogspot.com/2011/02/animation-in-honeycomb.html

你可以:

  • 创建一个ViewGroup,每次onDraw移动其子项
  • 覆盖View的onDraw以自行移动 - 可以使用边距或填充或位置(如果视图位于FrameLayout或类似内容中)。
  • 仅使用3.0+设备
  • 覆盖父的onTouch(或onInterceptTouchEvent),计算绘制视图的位置(可以从动画*中获取实际位置的距离和偏移量)并相应处理... *查看代码(从你每次完成时都会生成一个随机方向),如果不跟踪你之前采用的方向,这可能是不可能的..

答案 1 :(得分:1)

你面临同样的问题,我最近...当你在按钮或任何其他视图上应用动画并使用setFillAfter(True)时,这意味着视图的图像移动而不是实际视图,这就是为什么它没有收听你的点击监听器,因为它只是你的视图图像而不是你的实际视图你必须做的事情,我根据你的情况回答我自己的问题解释...意味着你还必须在动画的最终位置移动实际的视图并使用setFillAfter(false),这样当你在anmation之后点击它然后它应该是一个实际的视图而不仅仅是用于动画目的的图像由android

检查此链接....

EditText stucks after animation and alive back on scrolling......?

在你的代码中使用setFillafter(false)并实际将按钮放在动画的结束位置,就像设置边距或根据你的布局使用适当的放置属性一样。通过应用这些更改,您的点击监听器将完美运行。

==>如果你正在尝试你的按钮的点击监听器在移动(有生命)时工作,那么据我所知它是不可能的,因为android只使用你的视图的图像来执行动画而不是实际的。

答案 2 :(得分:0)

这可能是一个线程问题。你应该阅读Event dispatch thread阅读painless threading以及如何在android异步中做事情并查看AsyncTask JavaDoc

简而言之:不应阻止主线程,因为它用于响应UI事件,例如按下按钮。因此,无论何时执行超过几毫秒的操作,都应该在另一个线程中异步执行。

答案 3 :(得分:0)

I think there are two things

1)你可以同时为一个对象处理一个事件。就像你按钮上的动画一样,这意味着你不能点击那个直到一个工作完成(据我了解你动画是按钮而不是其他部分屏幕)

2)第二,如果你在屏幕的休息部分播放,你想在点击按钮时停止它。然后我认为它是一个焦点的问题。将onfoucslistener设置为按钮,并在你点击它时检查它是不是获得关注?

答案 4 :(得分:0)

我会将动画放入异步任务中,然后按钮点击应该在我认为的主线程上正常处理。因为你现在这样做的方式是:动画启动并阻止主线程。这意味着在异步任务

中无法执行click事件

答案 5 :(得分:-1)

您必须尝试使用​​AsyncTask 。没有它的Android编程将是可怕的可用性严重问题。

有关如何使用asynctask的信息,请参阅此link

这是一个例子:

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 :? )
        }
    }

}

<强>改性

你必须始终扩展Asynctask Activity ,因为你试图通过它传递params,你必须在扩展类的头部定义它们:

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

然后首先是doInBAckground参数,接下来是onPreExecute参数,最后一个是onPostExecute参数。这样你可以像按钮一样发送参数。

您可以在我的第一个链接中了解有关here的更多信息。