Android clipPath эквивалент для аппаратного ускорения View - программирование

Android clipPath эквивалент для аппаратного ускорения View

Единственная часть моего приложения, которое по-прежнему является программным обеспечением, - это рендеринг одного вида, где мне нужно нарисовать круговую растровую карту. Я использую clipPath для клипа растрового изображения, которое мне нужно отобразить в круглую форму.

Я понимаю, что clipPath не аппаратно ускоряется, но я ищу алгоритм, который позволил бы мне предоставить эквивалентную функциональность с помощью аппаратного ускорения.

В частности, мне нужно создать круглую область отсечения исходного растрового изображения и отобразить ее на моем холсте.

4b9b3361

Ответ 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);