皆さん、こんにちは、
canvas.drawPath(mPath, mPaint);を使用して線を描画します。方法。しかし、いくつかの問題があり、線がそれ自体と交差しているかどうかを取得したいと考えています。だから助けてください。
前もって感謝します
パフォーマンスと 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();
}
}
}
イベントから座標を保存する
@Override
public boolean onTouchEvent(MotionEvent event) {
event.getX();event.getY()`
}
Hashmap に変換して比較する
私はあなたが最善の策だと思います:
1)現在キャンバスにあるものを表す1つのパスを保持し、を使用するたびに、canvas.drawPath(nextPath)
それをグローバルパスにも追加して、次のようなことを行いますglobalPath.addPath(nextPath)
2) この投稿を見てください: Android の SurfaceView のキャンバスでのビットマップによる衝突検出。globalPath を nextPath と比較して、衝突するかどうかを判断できるはずです。
3) 代わりに、単一のパスがそれ自体と衝突するかどうかを知りたいだけで、新しいパスなどを追加することを気にしない場合は、このパスをどのように描画しているかについての詳細情報が必要です。線、円弧、円で??