播放动画时,Android按钮不可点击



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

但是不工作

编辑:这里是完整的源代码

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

你可以:

  • 创建一个ViewGroup,每次onDraw都移动它的子视图
  • 覆盖你的视图的onDraw移动自己-可以使用边距或填充,或位置(如果视图在一个框架布局或类似的东西)。
  • 只使用3.0+设备
  • 覆盖父的onTouch(或onInterceptTouchEvent),计算视图被绘制的位置(你可以从动画中获得多远的距离和实际位置的偏移量)并相应地处理…*看看你的代码(因为你每次完成时生成一个随机方向),如果不跟踪你以前采取的方向,这可能是不可能的。

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

点击此链接....

EditText卡住后动画和活着的滚动......?

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

==>如果你想让你的按钮的点击监听工作,而它的移动(动画),那么据我所知,这是不可能的,因为android只使用你的视图的图像来执行动画,而不是实际的。

这可能是线程问题。你应该阅读事件调度线程和如何在android异步中做事情,阅读无痛苦线程,看看AsyncTask JavaDoc。

简而言之:主线程不应该被阻塞,因为它是用来响应UI事件的,比如按钮按下。因此,无论何时,当您执行的操作花费的时间超过几毫秒时,您应该在另一个线程中异步执行该操作。

I think there are two things

1)你可以一次处理一个对象的一个事件。就像动画在你的按钮上播放,这意味着你不能点击它,直到一个工作完成(据我所知,你的动画是在按钮上,而不是在屏幕的其他部分)

2)第二,如果你在屏幕的休息部分播放,你想在点击按钮时停止它。那么我认为这是焦点的问题。一旦设置onfocuslistener按钮,并检查当你点击它,它得到焦点吗?

我会把动画放入异步任务,然后按钮点击应该在主线程上正常处理,我认为。因为你现在的做法是:动画开始并阻塞主线程。这意味着click事件不能在异步任务

中执行。

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

请参阅此链接了解如何使用asynctask。

下面是一个例子:

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参数。这样你就可以像发送Button一样发送参数。

你可以在这里或在我的第一个链接中了解更多。

相关内容

  • 没有找到相关文章

最新更新