Пользовательская группа 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