确定surfaceview完全透明的时间

时间:2013-06-04 18:39:43

标签: android surfaceview transparent

我正在编写像app一样的刮刮卡,我使用SurfaceView。 我用某种颜色填充它,然后使用PorterDuff.Mode.CLEAR PorterDuffXfermode在其上绘制一些Path。我必须确定用户何时完全划伤它(SurfaceView' s画布完全透明)。任何人都可以给我一些建议,如何识别它?

我尝试保存路径的坐标,但由于绘图笔划的宽度,我无法很好地计算覆盖区域。

我尝试从SurfaceView的getDrawingCache方法获取一个Bitmap并迭代其像素并使用getPixel方法。它不起作用,我认为这不是检查画布的有效方法。

1 个答案:

答案 0 :(得分:0)

假设画布不会很大或可扩展到任意大小,我认为循环像素会有效。

给定一个大尺寸或任意大小的画布,我会创建一个画布的数组表示,并在你去的时候标记像素,保持用户至少击中一次的数量。然后根据阈值测试该数字,该阈值确定必须划分多少票证才能被视为“划掉”。传入的伪代码

const int count = size_x * size_y; // pixel count
const int threshhold = 0.8 * count // user must hit 80% of the pixels to uncover
const int finger_radius = 2; // the radias of our finger in pixels
int scratched_pixels = 0;
bit [size_x][size_y] pixels_hit; // array of pixels all initialized to 0

void OnMouseDown(int pos_x, int pos_y)
{
    // calculates the mouse position in the canvas
    int canvas_pos_x, canvas_pos_y = MousePosToCanvasPos(pos_x, pos_y);
    for(int x = canvas_pos_x - finger_rad; x < canvas_pos_x + brush_rad; ++x)
    {
        for(int y = canvas_pos_y - finger_rad; y < canvas_pos_y + brush_rad; ++y)
        {
            int dist_x = x - canvas_pos_x;
            int dist_y = y - canvas_pos_y;
            if((dist_x * dist_x + dist_y * dist_y) <= brush_rad * brush_rad
                && pixels_hit[x][y] == 0)
            {
                ++scratched_pixels;
                pixels_hit[x][y] = 1;
            }
        }
    }
}

bool IsScratched()
{
    if(scratched_pixels > threshhold)
        return true;
    else
        return false;
}