0

私は画像のみを使用しており、アプリケーションを表示するために使用しているウィンドウのサイズは、システムによって異なる場合があります。プログラムのメインビューでのクリックをリッスンしているマウスアクションリスナーがあります。ボタンのような角の丸い長方形があります。すべてのシステムで、マウスアクションリスナーが画像全体ではなく、角の丸い長方形の領域のみをリッスンするようにしたいと思います。タイトルにあるように、画像全体にコンテンツが含まれているわけではありません。特に、角が画像の一部であるようには見えないため、ユーザーが画像の一部をクリックすることを許可したくありません。コンテンツが表示され、コンテンツのある部分をクリックした場合と同じ結果が得られます。私の画像はこれに似ています(出典:youthedesigner.com画像

だから私は、ユーザーがボタンの周りの素敵なものではなく、画像内のボタンをクリックした場合にのみ、プログラムに何かをさせたいのです。これは私が今クリックを聞くために持っているものです:

@Override
public void mouseClicked(MouseEvent e) {
    for(int i = 0; i <= 200; i++) {
        if(e.getY() >= 100+i && e.getY() <= 300) {
            if(e.getX() >= 10+100-Math.pow(10000-(Math.pow((i-100),2.0)),.5)) && e.getX() <= 10+400-Math.pow(10000-(Math.pow((i-100),2.0)),.5))) {
                // do stuff
                i = 201;
            }
        }
    }
}

コードで使用している数式は、110-(10000-(y-100)^ 2)^(1/2))のようになります。これは、グラフ化すると、開き括弧のようになり、410 +(10000- (y-100)^ 2)^(1/2))、これは最初のグラフから400単位離れた括弧のように見えます。

コードは私のシステムでは正常に機能しますが、他のシステムではまったく機能せず、画像の拡大縮小に対応するために、聞いている場所をどのように移動できるのか興味があります。

あなたが提供できるどんな助けにも感謝します。

4

3 に答える 3

1

forループは不要です。

ボタン(.png)の外側のピクセルにある程度の透明度があることを確認してから、アルファカラーコンポーネントを確認できます。

この場合、Rectを追加して、それを探すことができます。

private boolean insideButton(Rectangle buttonRect, Point mousePt) {
    if (buttonRect.contains(mousePt)) {
        int r = buttonRect.height() / 2;
        if (mousePt.x < r) {
            // Left circle with O at (r, r)
            int xFromO = r - mousePt.x;
            int yFromO = r - mousePt.y;
            if (xFromO * xFromO + yFromO * yFromO > r * r) {
                return false; // Outside circle
            }
        }
        if (mousePt.x > buttonRect.right - r) {
            // Right circle:
            ...
        }
        return true;
    }
    return false;
}
于 2012-11-22T08:48:31.233 に答える
0

そこで、Joopの答えを使って問題を解決しました。彼の答えは私が探していたものではありませんでしたが、それは私が私の問題を解決するために必要なアイデアを私に与えました。私がたどり着いた解決策は次のとおりです。

private boolean insideButton(Rectangle buttonRect, Point mousePt) {
    if (buttonRect.contains(mousePt)) {
        int r = (int)buttonRect.getHeight()/2; // radius of either of the circles that make up the sides of the rectangle
        if(mousePt.x <= buttonRect.getWidth()/2) { // if it is on the left of the button
            Point center = new Point((int)buttonRect.getX()+r, (int)buttonRect.getY()+r); // the center of the circle on the left
            double lengthToPoint = Math.pow(Math.pow(mousePt.x-center.x, 2)+Math.pow(mousePt.y-center.y, 2), 1.0/2); // length from center to the point that the user clicked at
            if(lengthToPoint > r && mousePt.x < center.x) { // if it is to the left of the center and out of the circle
                return false;
            } else {
                return true;
            }
        } else { // if it is on the right, the rest of the code is just about the same as the left circle
            Point center = new Point((int)buttonRect.getWidth()-r, (int)buttonRect.getY()+r);
            double lengthToPoint = Math.pow(Math.pow(mousePt.x-center.x, 2)+Math.pow(mousePt.y-center.y, 2), 1.0/2);
            if(lengthToPoint > r && mousePt.x > center.x) {
                return false;
            } else {
                return true;
            }
        }
    } else {
        return false;
    }
}

計算が少し行き過ぎて非効率的であることはわかっていますが、この方法で提示して、ソリューションがどのように機能するかをよりよく理解できるようにしたいと思いました。

于 2012-11-23T02:58:05.040 に答える
0

私は少なくとも2つの方法を考えることができます。

1つ目は、マスク画像(白黒)を作成することです。ここで、(たとえば)白はクリック可能な領域を示します。基本的に、元の画像のクリックピックポイントに基づいてマスクのピクセルカラーを比較できます。

Shapeもう1つの方法は、基本的にAPIのようなものを使用して非長方形の形状を可能にする画像マップを作成することです。これによりShape#contains、マウスがその内部をクリックしたかどうかを判断するために使用できます

いずれの場合も、元の画像のx/y位置を考慮する必要があります

于 2012-11-22T08:24:55.497 に答える