我有一个按钮,当这个按钮正在播放动画时,我无法点击按钮。我设置了点击监听器和触摸监听器但在调试模式下它没有进入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一样发送参数。
你可以在这里或在我的第一个链接中了解更多。