大家好,
我使用canvas.drawPath(mPath, mPaint);画一条线 方法。但是有一些问题,我想知道线是否与自身相交。所以请帮忙。
提前致谢
为了获得更好的性能和 UI 响应,请创建一个带有 Handler 和 Looper 的单独线程。还使用 HashSet 存储路径,当您添加位置时,该路径会告诉您相交,因为 add() 返回一个布尔值。
这是一些希望能提供更好性能的代码。
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)保留一个代表画布上当前内容的路径,每次使用时canvas.drawPath(nextPath)
,还将其添加到全局路径并执行类似的操作globalPath.addPath(nextPath)
2) 看看这篇文章:Collision detection with bitmaps on SurfaceView's canvas in Android。看来您应该能够将 globalPath 与 nextPath 进行比较,并判断它们是否发生碰撞。
3) 如果您只想知道单个路径是否与自身发生冲突,而不关心添加新路径或其他任何内容,我们需要有关您如何绘制此路径的更多信息。用线、弧、圆??