【问题标题】:android button not clickable while playing animations播放动画时无法点击android按钮
【发布时间】:2011-12-07 06:01:04
【问题描述】:

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

【问题讨论】:

    标签: android animation button clickable


    【解决方案1】:

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

    你可以:

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

    【讨论】:

      【解决方案2】:

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

      检查此链接....

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 但我希望我的按钮在播放动画时可以点击。动画会一直播放到按钮被点击
        【解决方案4】:
        I think there are two things
        

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

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

        【讨论】:

        • 点击按钮时没有获得焦点
        • 所以它不可能点击它。你能把屏幕图片发给我吗
        • 这对你没有帮助,你只会在屏幕上看到两个按钮......这是我尝试的最后一个版本代码:pastie.org/2713243
        【解决方案5】:

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

        【讨论】:

        • 但是您只能从 UI 线程而不是其他线程对 UI 进行更改。
        • 我理解的文档是这样的:在 onPostExecute() 中你可以更新 UI,所以如果你把你的动画放在这个方法中它可能会起作用
        • 我已经为异步类中的按钮添加了动画,并在 UI 线程中处理了 onClick 事件,但仍然无法正常工作......这是我的代码:pastie.org/2713243
        【解决方案6】:

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

        请参阅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,因为您试图通过它传递参数,所以您必须在扩展类的头部定义它们:

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

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

        您可以了解更多关于here 或在我的第一个链接中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-11
          • 1970-01-01
          • 1970-01-01
          • 2013-08-29
          • 2016-02-11
          • 1970-01-01
          相关资源
          最近更新 更多