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

あなたは出来る:

  • onDraw ごとに子を移動する ViewGroup を作成する
  • ビューの 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

アニメーションを非同期タスクに入れてから、ボタンのクリックをメインスレッドで通常どおり処理する必要があります。現時点での方法は次のとおりです。アニメーションが開始され、メインスレッドがブロックされます。これは、非同期タスクでクリック イベントを実行できないことを意味します。

于 2011-10-17T07:56:01.833 に答える
0

これは、スレッドの問題である可能性があります。イベントディスパッチスレッドと、痛みのないスレッドを読んでアンドロイド非同期で行う方法を読んで、 AsyncTask JavaDocを見てください。

つまり、メイン スレッドは、ボタンの押下などの UI イベントへの応答に使用されるため、ブロックされるべきではありません。したがって、数ミリ秒以上かかる処理を行う場合は、別のスレッドで非同期に処理する必要があります。

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

1)1つのオブジェクトに対して一度に1つのイベントを処理できます.ボタンでアニメーションが再生されているように、1つの作業が完了するまでクリックすることはできません(私が理解しているように、アニメーションは画面の他の部分ではなくボタンにあります)

2)2番目に、画面の残りの部分で再生していて、ボタンをクリックして停止したい場合は、フォーカスの問題だと思います.onfoucslistenerをボタンに設定し、クリックするとフォーカスが得られますか?

于 2011-10-17T07:11:14.433 に答える
-1

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 パラメータです。そうすれば、ボタンのようにパラメーターを送信できます。

詳細については、こちらまたは最初のリンクをご覧ください。

于 2011-10-13T19:57:31.860 に答える