Пользовательская группа ViewGroup с круговым дочерним элементом

Я хотел бы реализовать пользовательский ViewGroup, который отображает один вид внутри. Сложность в том, что дочерний вид должен быть обрезан в форме круга, и он должен быть нарисован быстро.

Каков наилучший способ реализовать это поведение?

Моя текущая реализация выглядит так:

@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
    child.setDrawingCacheEnabled(true);
    child.buildDrawingCache();
    child.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    canvas.drawBitmap(getCroppedBitmap(child.getDrawingCache()), outerWidth, outerWidth, new Paint());
    child.setLayerType(View.LAYER_TYPE_NONE, null);
    return true;
}

public Bitmap getCroppedBitmap(Bitmap bitmap) {
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
            bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    childPaint.setXfermode(null);
    canvas.drawARGB(0, 0, 0, 0);
    canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2,
            bitmap.getWidth() / 2, childPaint);
    childPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, mBoundsI, mBoundsI, childPaint);
    return output;
}

(Каждый раз, когда создаются новые Canvas и Bitmap, а также включается кэш чертежа)

1 ответ

Решение

Вероятно, самый быстрый способ достичь этого - позволить представлениям рисовать непосредственно на холсте (избегая создания буфера и растрового изображения).

Для этого вы должны указать на холсте путь клипа и путь, для которого задан соответствующий круг.

Тогда холст не будет рисовать ничего, что нарисовано вне его обтравочного контура

пс.: не забудьте использовать соответствующие REPLACE Регион при последующих вызовах на clipPath

Другие вопросы по тегам