0

我想我的问题很简单。

我想在触摸它时立即在画布上画一个点。点将被绘制到我触摸的位置。接下来我想在屏幕上绘制另一个点,但不是在第一个点的位置。意味着我想防止在另一个图像上绘制图像。

我试图用以下代码归档:

活动课

    public class Draw extends Activity {
    DrawView drawView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set full screen view
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                                         WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        drawView = new DrawView(this);
        setContentView(drawView);
        drawView.requestFocus();
    }
}

帆布类

    public class DrawView extends View implements OnTouchListener {
    private static final String TAG = "DrawView";

    List<Point> points = new ArrayList<Point>();
    Vector<Bitmap> bitmaps = new Vector<Bitmap>();
    Paint paint = new Paint();


    public DrawView(Context context) {
        super(context);
        setFocusable(true);
        setFocusableInTouchMode(true);

        this.setOnTouchListener(this);
    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        for (Point point : points) {
            canvas.drawBitmap(bitmaps.get(point.i), point.x, point.y, paint);
        }
    }

    public boolean onTouch(View view, MotionEvent event) {
        Log.d("Touch","Touch");
        Log.d("Points", "" + points.size());
        Log.d("Bitmaps", "" + bitmaps.size());

        int i = 0;
        for (Point point : points) {
            int height = bitmaps.get(i).getHeight();
            int width = bitmaps.get(i).getWidth();
            //Log.d("dimensions", height + ", " + width);

            for (int x = 0; x <= width; x++) {
                if (Math.floor(point.x + x) == Math.floor(event.getX())) {
                    points.get(i).isTaken = true;
                    Log.d("isTakenX", "" + point.isTaken);
                    break;
                }
                for (int y = 0; y <= height; y++) {
                    if (Math.floor(point.y + y) == Math.floor(event.getY())) {
                        points.get(i).isTaken = true;
                        Log.d("isTakenY", "" + point.isTaken);
                        break;
                    }
                }
            }
            i++;
        }
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            Log.d("EventDown","DOWN");
            boolean isTaken = false;
            for (Point point : points) {
                if (point.isTaken) {
                    isTaken = true;
                }
            }
            if (!isTaken) {
                bitmaps.add(BitmapFactory.decodeResource(getResources(), R.drawable.greenstar));
                Point point = new Point();
                point.x = event.getX();
                point.y = event.getY();
                point.i = bitmaps.size() - 1;
                points.add(point);
                //Log.d("pointClick",point.toString());
                invalidate();
                return true;
            }
        }
        return false ;
    }
}

    class Point {
        float x, y;
        int i;
        boolean isTaken = false;

        @Override
        public String toString() {
            return i + ": " + x + ", " + y;
        }
    }

在 onTouch 方法中,您可以看到我如何确定我不想过度绘制的图像的位置。我将所有图像及其绘制的点保存到列表中,以便能够修改它们。接下来,我检查图像在屏幕上占用了多少空间,以及我是否只是单击了该空间。

但是,在将第一张图像绘制到画布上后,我无法再绘制另一张图像。似乎程序卡在“isTaken”上。可能我关于如何检查空间是否被占用的对数是错误的。但是,无法弄清楚出了什么问题。

你有什么想法吗?

提前致谢

4

1 回答 1

1

好的几点。一个逻辑错误和几项改进。(代码和想法)

第一:当您使用foreach构造时,使用循环中的变量(例如点)从您正在循环的列表中访问实例。所以points.get(i)用一个简单的point.

第二:因为你有圆圈,所以你不必检查点是否在矩形中(我想这就是你想要实现的)。检查两点中心的距离(已经绘制的和要绘制的新点)是否足够大。为此使用毕达哥拉斯方程 (c^2 = a^2 * b^2)。

第三(实际错误):您两个 for 循环的逻辑是错误的,您分别处理 x 和 y 但您必须一起检查它们。你不需要循环来实现你想要的。

将您的 for 循环更改为:

if(Math.pow(radius*2,2) > Math.pow(event.getX-point.x,2)+Math.pow(event.getY-point.Y, 2))
        point.isTaken = true;

其中radius是绘制圆的半径。如果您有更多问题,请尝试并报告。

于 2012-08-09T19:06:10.583 回答