私が集めていることから、あなたはあなたが言っていることから、あなたはの中に描かれた三角形を持っていRelativeLayout
ますCustomView
。実際のView
サイズはFILL_PARENT
幅と高さの両方です。したがって、三角形のタッチ可能な領域を表す正方形は、親のタッチ可能な領域を表す正方形と同じRelativeLayout
です。
三角形の描画領域内のタッチイベントを三角形が受け取り、View
外側のすべてを親が受け取るようにします。私が理解していることからカスタムタッチエリアを定義することはできません。
それでも、描画境界を操作してフォーカスをタッチし、目的を達成することができます。
どのようにそれを行うことができますか
CustomView
トライアングルを使用して、常にタッチイベントを受信するようにしてください。タッチイベントを受信すると、基本的な計算を実行して、タッチが三角形の領域内にあるかどうかを判断します(三角形を描画するために使用する三角形の境界を、のグローバル変数として保存する必要がありますCustomView
)。
次に、イベントを実行して消費するか渡すかを決定するための単純な条件ステートメント(に何かを実行させたい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()で調べる必要があります。