したがって、この質問に続いて、丸みを帯びたボタン、ビューの端の一種のマップを作成する必要があると思います。たとえば、次のようなビューがあるとします。
ボタンは青や特定の色にはならないため、最後の質問の回答の1つで示唆されているように、ユーザーが触れた場所が青であるかどうかを確認することはできません。
タッチイベントを受信し、このビュー内のタッチの位置を取得したとしましょう。ビューは正しく、青い部分を押した場合にのみ入力を取り込みたいと思います。どうすればこれを理解できますか?
グラフィックのバウンディングボックスがビューを正確に埋めていると仮定しましょう。次のように進めることができます。関心のある領域は、2つの同心円とビューで囲まれています。(円の中心はビューの右下隅です。)タッチを取得したら、タッチ座標から右下隅までの距離を計算し、それを2つの円の半径と比較する必要があります。(平方根を平方根と比較することで、平方根を回避できます。)距離が半径の間にある場合、タッチは青(または任意の色)になります。タッチがバウンディングボックス内にあるかどうかを計算する必要はありません。イベントがビューに配信されてから、私たちはすでに知っています。
ここにいくつかのサンプルコードがあります。これは、ポイントが2つの同心円(環)内にあるかどうか、およびある場合はどの象限に当たるかを判別する検出器用です。
public class ArcHitDetector {
public enum Quadrant {
TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT
}
private int xCenter, yCenter, innerR2, outerR2;
/**
* Construct an ArcHitDetector for an annulus centered at given
* points and with given inner and outer radii.
*
* @param xCenter the horizontal center coordinate
* @param yCenter the vertical center coordinate
* @param outerR the outer radius of the annulus
* @param innerR the inner radius of the annulus
*/
public ArcHitDetector(int xCenter, int yCenter, int outerR, int innerR) {
this.xCenter = xCenter;
this.yCenter = yCenter;
this.outerR2 = outerR * outerR;
this.innerR2 = innerR * innerR;
}
/**
* Classify a point with respect to the annulus. It assumes
* screen coordinates (x increases to the right; y increases
* down).
*
* @param x the x coordinate of the point to test
* @param y the y coordinate of the point to test
*
* @return the Quadrant of the annulus in which the point falls,
* or null if the point does not lie in the annulus
*/
public Quadrant classifyHit(int x, int y) {
int dx = x - xCenter;
int dy = y - yCenter;
int d2 = dx * dx + dy * dy;
if (d2 <= outerR2 && d2 >= innerR2) {
if (x >= xCenter) {
return y <= yCenter ? TOP_RIGHT : BOTTOM_RIGHT;
} else {
return y <= yCenter ? TOP_LEFT : BOTTOM_LEFT;
}
} else {
return null;
}
}
}
その形状の上下の曲線を表す方程式、2つの逆さまの放物線を作成し、与えられたx値でyが下の曲線方程式のyより大きいかどうか、およびyが小さいかどうかを確認することをお勧めします。与えられたx値での上の曲線のy(そして、0が下であり、xがボタンの右端よりも小さいと仮定すると、yは0よりも大きくなります)。