Android面具手指涂料与其他不规则形状的图像

时间:2013-11-19 05:45:24

标签: android titanium

我试图在非标准形状上绘画,例如它对用户显示完全透明的视图,但他只能在视图的某些区域(如动物形状)绘制这一切都是因为动物器官形状将在回到油漆视图。

image in the back layer in z-axis

前层将是透明视图,我将用于绘画。

@Override
protected void onDraw(Canvas canvas) {
    boolean containsBG = props.containsKeyAndNotNull(
                                             TiC.PROPERTY_BACKGROUND_COLOR);
    canvas.drawColor(containsBG ?
                    TiConvert.toColor(props, TiC.PROPERTY_BACKGROUND_COLOR) :
                    TiConvert.toColor("transparent"));
    canvas.drawBitmap(tiBitmap, 0, 0, tiBitmapPaint);

    for (int i = 0; i < maxTouchPoints; i++) {
        if (tiPaths[i] != null) {
            canvas.drawPath(tiPaths[i], tiPaint);
        }
    }
}

private void touch_start(int id, float x, float y) {
    tiPaths[id] = new Path();
    tiPaths[id].moveTo(x, y);
    tiX[id] = x;
    tiY[id] = y;
}

private void touch_move(int id, float x, float y) {
    if (tiPaths[id] == null) {
        tiPaths[id] = new Path();
        tiPaths[id].moveTo(tiX[id], tiY[id]);
    }
    tiPaths[id].quadTo(tiX[id], tiY[id], (x + tiX[id]) / 2, (y + tiY[id]) / 2);
    tiX[id] = x;
    tiY[id] = y;
}

@Override
public boolean onTouchEvent(MotionEvent mainEvent) {
    for (int i = 0; i < mainEvent.getPointerCount(); i++) {
        int id = mainEvent.getPointerId(i);
        float x = mainEvent.getX(i);
        float y = mainEvent.getY(i);
        int action = mainEvent.getAction();
        if (action > 6) {
            action = (action % 256) - 5;
        }
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                finalizePath(id);
                touch_start(id, x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                touch_move(id, x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                finalizePath(id);
                invalidate();
                break;
        }
    }

    return true;
}

public void finalizePath(int id) {
    if (tiPaths[id] != null) {
        tiCanvas.drawPath(tiPaths[id], tiPaint);
        tiPaths[id].reset();
        tiPaths[id] = null;
    }
}

public void finalizePaths() {
    for (int i = 0; i < maxTouchPoints; i++) {
        if (tiPaths[i] != null) {
            tiCanvas.drawPath(tiPaths[i], tiPaint);
            tiPaths[i].reset();
            tiPaths[i] = null;
        }
    }
}

任何人都可以帮助实现这一目标。提前谢谢

1 个答案:

答案 0 :(得分:0)

如果你有面具并且在使用你的应用程序时它不会改变,也许你可以试试这个:

  1. 将形状设置为仅2种颜色:黑色和白色(如alpha 渠道)。您不需要显示黑白图片 用户。在这篇文章的人物图片上,只需填写内部 黑色的轮廓,并相应地参考你的代码。
  2. 在想要在图片上绘制的每个点使用bitmap.getpixel, 如果它是黑色的,你可以让油漆适用于你的功能,如果是的话 白色,你解雇了这个功能。通常黑色是100%
    透明,但由于你的照片已经有边框白色, 你可以做其他事。