2

親ビューはRelativeLayoutであり、Viewクラスを拡張する三角形を追加しました。キャンバスとペイントを使って三角形を描きます。私が直面している問題は、相対レイアウトに触れると、両方のタッチリスナー、相対レイアウト、および三角形がトリガーされることです。三角形が必要なだけ正確なスペースをとるようにしたいだけです。親レイアウト全体を占めるのではなく、カスタムビュー(この場合は三角形)をスペースを取るように制限するにはどうすればよいですか?

実際の私の要件は次のとおりです。レイアウト上に1つの相対レイアウトがあり、いくつかのカスタムビューを動的に追加しています。それらには、三角形内のポイントをドラッグするためのタッチリスナーがありますが、親ビューと子ビューに対して別々にタッチリスナーをトリガーできないため、親ビューの全画面表示を取得しています。

私はこの問題の解決策を開発するのに数え切れないほどの時間を費やしてきましたが、頭を悩ませることはできませんでした。どんな助けでも大歓迎です。

4

2 に答える 2

3

私が集めていることから、あなたはあなたが言っていることから、あなたはの中に描かれた三角形を持っていRelativeLayoutますCustomView。実際のViewサイズはFILL_PARENT幅と高さの両方です。したがって、三角形のタッチ可能な領域を表す正方形は、親のタッチ可能な領域を表す正方形と同じRelativeLayoutです。

三角形の描画領域内のタッチイベントを三角形が受け取り、View外側のすべてを親が受け取るようにします。私が理解していることからカスタムタッチエリアを定義することはできません。

それでも、描画境界を操作してフォーカスをタッチし、目的を達成することができます。

どのようにそれを行うことができますか

  1. CustomViewトライアングルを使用して、常にタッチイベントを受信するようにしてください。タッチイベントを受信すると、基本的な計算を実行して、タッチが三角形の領域内にあるかどうかを判断します(三角形を描画するために使用する三角形の境界を、のグローバル変数として保存する必要がありますCustomView)。

  2. 次に、イベントを実行して消費するか渡すかを決定するための単純な条件ステートメント(に何かを実行させたいTouchEventですRelativeLayoutか?そうでない場合は、これがはるかに簡単になります)。

コードスケルトンの例:

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean inTriangle = false;
    float x = event.getX();
    float y = event.getY();

    // This really depends on what behaviour you want, if a drag extends outside the
    // triangle bounds, do you want this to end the touch event? This code could be done
    // more efficiently depending on your choices / needs

    // Do maths to figure out if the point is actually inside the triangle. Once again,
    // many solutions and some much easier than others depending on type of triangle

    // This flow will only register events in the triangle, and do nothing when outside
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        if (inTriangle) {
            // Do whatever it is you want to do

            return true; // to say you consumed the event if necessary
        } else {
            return false; // parent RelativeLayout should now get touch event

    }
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
    if (inTriangle) {
        // Do whatever it is you want

        return true;
    } else {
        // Do nothing
        return true; // So is stil consumed
    }
}

return true;

}

正直なところ、問題は、より具体的なものを提供するための自由形式/不明確な方法です。しかし、これはあなたがあなたが求めたことを達成する方法です。特定のシナリオに適用するだけです。

注:パスで問題が発生しTouchEventたため、本当に特定の場所にパスしたい場合は、タッチが処理されている順序が問題になるかどうかをView.dispatchTouchEvent()で調べる必要があります。

于 2012-07-23T04:26:19.967 に答える
1

ビューRalativeLayoutとカスタムビューの両方にタッチしているため、三角形のタッチイベントを処理する際に問題が発生します。

この問題を解決するには、カスタムビューのonTouchEventでいくつかの変更を行う必要があります。たとえば、カスタムビューにタッチしていて、イベントを処理する場合は、onTouchEventから、親ビューがタッチイベントを取得しないように、falseではなくtrueを返す必要があります。

于 2012-07-16T05:12:50.620 に答える