我让用户在我的应用程序中进行绘画。一旦整个屏幕被绘制,应用程序将在屏幕上显示一些选项。
我正在考虑保留一系列屏幕像素,例如。 pixel = new int[width][height];
并在绘制像素时标记它,但我想这对我的问题来说是一个糟糕的解决方案。
有没有办法检测用户是否画了整个屏幕?
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN: {
X = (int) ev.getX();
Y = (int) ev.getY();
break;
}
case MotionEvent.ACTION_MOVE: {
X = (int) ev.getX();
Y = (int) ev.getY();
break;
}
return true;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(X, Y, 50, paint);
}
答案 0 :(得分:1)
除了使用数组来跟踪像素的状态之外,我什么都想不到。然而,2D阵列比使用2个并行1D阵列慢。但是如何将所有像素放在一个单独的数组中并在绘制时,从阵列中删除它的元素呢?您可以简单地将数组长度检查为0,而不是遍历整个数组。
答案 1 :(得分:0)
我认为你的方法(保持矩阵)可能是正确的,但如果画笔的大小远大于1像素,那么保持较低分辨率矩阵可能是有意义的:你可能不会需要像素精确度。是的,通过这种方式,您可以让用户在屏幕上没有填充所有像素,但这会占用更少的内存。
答案 2 :(得分:0)
答案可能是创建一个位图。所有颜料都出现在位图中,并与画布相连,以使其保持同步。
检查是从计时器和后台线程完成的,后台线程定期调用Bitmap.copyPixelsToBuffer将数据复制到IntBuffer中。然后你可以一次走缓冲区一个像素(一个int32)。如果所有像素都是相同的值,您就知道屏幕已填满,您可以做出您喜欢的响应。
更高效的实现可能会将用户的绘图用作后台计时器的触发器,并将自身限制为自上次检查后用户绘制的边界的并集,而不是再次检查整个屏幕。
答案 3 :(得分:0)
使用用户无法绘制的背景颜色。每当像素从背景颜色变为新颜色时,向计数器添加一个(参见AD的建议)。