6

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

但它不工作

编辑:这是完整的源代码

4

6 回答 6

8

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

你可以:

  • 制作一个 ViewGroup,它会在每个 onDraw 上移动它的孩子
  • 覆盖视图的 onDraw 以移动自身 - 可以使用边距或填充,或位置(如果视图位于 FrameLayout 或类似的东西中)。
  • 仅使用 3.0+ 设备
  • 覆盖父级的 onTouch(或 onInterceptTouchEvent),计算视图的绘制位置(您可以从动画 * 获取实际位置的距离和偏移量)并相应地处理... * 查看您的代码(因为您生成了每次完成时随机方向),如果不跟踪您以前采取的方向,这可能是不可能的..
于 2011-10-17T14:37:49.700 回答
1

您面临与我最近遇到的相同问题...当您在按钮或任何其他视图上应用动画并使用 setFillAfter(True) 时,这意味着视图的图像被移动而不是实际视图,这就是它不听您的点击监听器的原因因为它只是视图的图像而不是您的实际视图,所以您必须根据您的情况做类似我在回答我自己的问题时解释的事情......意味着您还必须将实际视图移动到动画的最后位置并使用 setFillAfter (false) 这样当您在动画后单击时,它应该是一个实际视图,而不仅仅是 android 用于动画目的的图像

检查此链接....

EditText 在动画后卡住并在滚动时重新活着......?

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

==>如果您尝试让按钮的点击侦听器在其移动(动画)时工作,那么据我所知这是不可能的,因为android仅使用您的视图图像来执行动画而不是实际的。

于 2011-10-21T12:35:10.597 回答
0

这可能是线程问题。您应该通过阅读无痛线程并查看AsyncTask JavaDoc来阅读Event dispatch thread以及如何在 android async 中执行操作。

简而言之:不应阻塞主线程,因为它用于响应 UI 事件,例如按钮按下。因此,每当你做一些花费超过几毫秒的事情时,你应该在另一个线程中异步地做。

于 2011-10-13T19:37:58.200 回答
0
I think there are two things

1)您可以一次为一个对象处理一个事件。就像在您的按钮上播放动画一样,这意味着您在完成一项工作之前无法单击该按钮(据我所知,您的动画在按钮上而不是在屏幕的其他部分)

2)其次,如果您在屏幕的其余部分播放并且您想在单击按钮时停止它。那么我认为这是焦点问题。一旦将 onfoucslistener 设置为按钮并检查当您单击它时是否获得焦点?

于 2011-10-17T07:11:14.433 回答
0

我会将动画放入异步任务中,然后我认为应该在主线程上正常处理按钮单击。因为你此刻做的方式是:动画启动并阻塞主线程。这意味着在异步任务中无法执行click事件

于 2011-10-17T07:56:01.833 回答
-1

您必须尝试使用​​ 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 :? )
        }
    }

}

修改的

您必须始终扩展 Asynctask Activity,因为您试图通过它传递参数,所以您必须在扩展类的头部定义它们:

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

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

您可以在此处或在我的第一个链接中了解更多信息。

于 2011-10-13T19:57:31.860 回答