web-dev-qa-db-ja.com

アニメーション中のすべてのタッチスクリーンインタラクションを無効にする

アニメーションが表示されている間、すべてのタッチスクリーン操作を無効にしたい。ボタンの数が多いため、アニメーションの開始時または終了時のボタンでsetClickable()メソッドを使用したくありません。助言がありますか?

14

アクティビティでは、onTouchEventをオーバーライドして常にreturn true;タッチイベントを処理していることを示します。

その関数のドキュメントを見つけることができます そこに

編集これは、すべてのビューを1つずつ処理する代わりに、画面全体でタッチを無効にできる1つの方法です...まず、現在のレイアウトを次のように変更します。

<FrameLayout
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    >

    < .... put your current layout here ... />

    <TouchBlackHoleView
        Android:id="@+id/black_hole"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" />
</FrameLayout>

次に、次のようなものでカスタムビューを定義します。

public class TouchBlackHoleView extends View {
    private boolean touch_disabled=true;
    @Override
    public boolean onTouchEvent(MotionEvent e) {
        return touch_disabled;
    }
    public disable_touch(boolean b) {
        touch_disabled=b;
    }
}

次に、アクティビティで、タッチを無効にすることができます

(TouchBlackHoleView) black_hole = findViewById(R.id.black_hole);
black_hole.disable_touch(true);

そしてそれを有効にします

black_hole.disable_touch(false);
6
Matthieu

この問題への回答

for (int i = 1; i < layout.getChildCount(); i++) { TableRow row = (TableRow) layout.getChildAt(i); row.setClickable(false);

すべてのビューを持つテーブルレイアウトのすべての行を選択し、それらを無効にしました

それを実装する簡単な方法は、その上に透明なレイアウトを追加することです(xmlの塗りつぶしの親の高さと幅に追加します)。

アニメーションの開始:transaparentlayout.setClickable(true);

アニメーションの終わり:transaparentlayout.setClickable(false);

最終的に私は@Matthieuの基本的な答えとしてそれをそのように機能させるようにしました。エラーが発生した理由を理解するのに30分ほどかかるため、回答を公開することにしました。

XML

<...your path to this view and in the end --> .TouchBlackHoleView
    Android:id="@+id/blackHole"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />

クラス

public class TouchBlackHoleView extends View {private boolean touchDisable = false;

public TouchBlackHoleView(Context context) {
    super(context);
}

public TouchBlackHoleView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public TouchBlackHoleView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return touchDisable;
}

public void disableTouch(boolean value){
    touchDisable = value;
}
}

使用する

blackHole = (TouchBlackHoleView) findViewById(R.id.blackHole);
blackHole.disableTouch(true);

楽しい