1

ここに画像の説明を入力

皆さん、こんにちは、

canvas.drawPath(mPath, mPaint);を使用して線を描画します。方法。しかし、いくつかの問題があり、線がそれ自体と交差しているかどうかを取得したいと考えています。だから助けてください。

前もって感謝します

4

3 に答える 3

3

パフォーマンスと UI 応答を向上させるには、ハンドラーとルーパーを使用して別のスレッドを作成します。add() はブール値を返すため、HashSet を使用して、位置を追加するときに交差点を示すパスを格納します。

これは、うまくいけばパフォーマンスが向上するはずのコードです。

public class MainActivity extends Activity {

    private Handler mHandler;
    private String position, lastPosition;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Tracker t = new Tracker();
        t.start();
    }

    @Override
    protected void onPause() {
        if (mHandler != null) 
            mHandler.getLooper().quit();
        super.onPause();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch(event.getAction()) {
        case MotionEvent.ACTION_MOVE:
            position = event.getX()+","+event.getY();
            if (position.equals(lastPosition)) break; 

            if (mHandler != null) {
                Message msg = Message.obtain();
                msg.obj = position;
                mHandler.sendMessage(msg);
            }

            lastPosition = position;
            break;
        }
        return true;
    }

    private class Tracker extends Thread {
        HashSet<String> path = new HashSet<String>(); 

        @Override
        public void run() {
            Looper.prepare();
            mHandler = new Handler() {
                public void handleMessage(Message msg) {
                    String position = String.valueOf(msg.obj);
                    if (!path.add(position)) 
                        Log.w("Intersection", position);//Handle the intersection
                }
            };          
            Looper.loop();
        }
    }
}
于 2013-04-06T04:40:59.080 に答える
2

イベントから座標を保存する

    @Override

public boolean onTouchEvent(MotionEvent event) { event.getX();event.getY()`

}

Hashmap に変換して比較する

于 2013-03-28T05:08:13.620 に答える
1

私はあなたが最善の策だと思います:

1)現在キャンバスにあるものを表す1つのパスを保持し、を使用するたびに、canvas.drawPath(nextPath)それをグローバルパスにも追加して、次のようなことを行いますglobalPath.addPath(nextPath)

2) この投稿を見てください: Android の SurfaceView のキャンバスでのビットマップによる衝突検出。globalPath を nextPath と比較して、衝突するかどうかを判断できるはずです。

3) 代わりに、単一のパスがそれ自体と衝突するかどうかを知りたいだけで、新しいパスなどを追加することを気にしない場合は、このパスをどのように描画しているかについての詳細情報が必要です。線、円弧、円で??

于 2013-04-09T21:09:06.797 に答える