Android clipPath эквивалент для аппаратного ускорения View
Единственная часть моего приложения, которое по-прежнему является программным обеспечением, - это рендеринг одного вида, где мне нужно нарисовать круговую растровую карту. Я использую clipPath для клипа растрового изображения, которое мне нужно отобразить в круглую форму.
Я понимаю, что clipPath не аппаратно ускоряется, но я ищу алгоритм, который позволил бы мне предоставить эквивалентную функциональность с помощью аппаратного ускорения.
В частности, мне нужно создать круглую область отсечения исходного растрового изображения и отобразить ее на моем холсте.
Ответы
Ответ 1
Если вам нужно использовать clipPath, вы можете отключить аппаратное ускорение, как показано ниже.
<application
android:label="@string/application_name"
android:hardwareAccelerated="false">
И вы также можете управлять аппаратным ускорением среди слоев Application, Activity, Window и View. Подробную информацию описывают эту статью Hardware Acceleration на веб-сайте Android Development.
Ответ 2
Вы можете попробовать, хотя я не уверен, что это аппаратное ускорение:
in onCreate:
в onLayout:
- создать растровое изображение того же размера, что и ваш вид
- нарисуйте круг внутри на своем холсте, в белом, используя анти-псевдоним для чистой границы.
в onDraw:
- нарисуйте растровое изображение с белым кружком в вашем холсте для рисования.
- нарисуйте растровое изображение внутри вашего краска с помощью bitmapPaint, созданного в onCreate
Растровое изображение должно отображаться только внутри круга.
Ответ 3
Если ваше растровое изображение не сильно изменится, закрепите его один раз до формы в новом растровом изображении, а затем нарисуйте обрезанное растровое изображение в вашем onDraw.
Вот пример того, как обрезать круг из исходного растрового изображения
Bitmap bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Canvas canvas = new Canvas(bitmap);
paint.setColor(Color.RED);
// Draw your shape here
canvas.drawCircle(cx, cy, radius, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(sourceBitmap, 0, 0, paint);