1

在此处输入图像描述

大家好,

我使用canvas.drawPath(mPath, mPaint);画一条线 方法。但是有一些问题,我想知道线是否与自身相交。所以请帮忙。

提前致谢

4

3 回答 3

3

为了获得更好的性能和 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();
        }
    }
}
于 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)保留一个代表画布上当前内容的路径,每次使用时canvas.drawPath(nextPath),还将其添加到全局路径并执行类似的操作globalPath.addPath(nextPath)

2) 看看这篇文章:Collision detection with bitmaps on SurfaceView's canvas in Android。看来您应该能够将 globalPath 与 nextPath 进行比较,并判断它们是否发生碰撞。

3) 如果您只想知道单个路径是否与自身发生冲突,而不关心添加新路径或其他任何内容,我们需要有关您如何绘制此路径的更多信息。用线、弧、圆??

于 2013-04-09T21:09:06.797 回答