我的问题很简单。
我想在触摸画布上画一个点。点将被绘制到我触摸的位置。接下来,我想在屏幕上绘制另一个点,但不要在第一个点的位置上。就是说我要防止在另一个图像上绘制图像。
我尝试使用以下代码来存档:
活动课
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”上。关于如何检查是否已占用空间的对数可能是错误的。但是,无法找出问题所在。
你有主意吗?
提前致谢
最佳答案
好的,几点。一种逻辑错误和多项增强功能。 (代码和想法)
第一:使用foreach
构造时,请使用循环中的变量(例如point)从要循环访问的列表中访问实例。因此,用一个简单的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;
半径是绘制圆的半径。
尝试使用该方法,如果还有其他问题,请报告。