Обойти Canvas.clipPath (), который больше не поддерживается в Android - PullRequest
23 голосов
/ 17 января 2012

Начиная с Android 3.0, метод clipPath () больше не поддерживается на устройствах с включенным аппаратным ускорением. (Прочитайте эту статью для получения более подробной информации).Я работаю с холстом и мне нужно нарисовать округлое изображение.Есть идеи, как мне это сделать?

* Я не могу отключить аппаратное ускорение, я ищу другое решение.

Ответ: Tnx @Malcolm за ваш ответ.Я нашел хороший пример, который демонстрирует эту технику , это в основном маска.

Ответы [ 2 ]

41 голосов
/ 17 января 2012

clipPath с аппаратным ускорением поддерживается только на уровне API 18 и выше, на уровнях API от 11 до 17 его необходимо отключить.

В упомянутой статье содержится подсказка:

Если на ваше приложение влияют какие-либо из этих отсутствующих функций или ограничений, вы можете отключить аппаратное ускорение только для уязвимой части вашего приложения, вызвав setLayerType (View.LAYER_TYPE_SOFTWARE, null) .Таким образом, вы все еще можете воспользоваться преимуществами аппаратного ускорения везде.См. Управление аппаратным ускорением для получения дополнительной информации о том, как включить и отключить аппаратное ускорение на разных уровнях в вашем приложении.

Основная идея здесь состоит в том, чтобы отключить аппаратное ускорение в частиприложение, в котором вам нужно использовать неподдерживаемые методы на устройствах с уровнем API ниже 18. Вы можете сделать это для определенного представления, нет необходимости полностью его отключать для всего приложения.

Если выне хочу отключать аппаратное ускорение, тогда я бы предложил использовать режимы Портера-Даффа.Вы можете создать растровое изображение с кружком в нем, а затем нарисовать свое изображение на холсте, используя такой режим, при котором ваше изображение будет обрезано до исходного содержимого.

27 голосов
/ 20 мая 2015

Canvas.clipPath() поддержка аппаратного ускорения возобновлена ​​с API 18 .

Лучший способ обойти эту проблему - вызывать setLayerType(View.LAYER_TYPE_SOFTWARE, null) только тогда, когда вы работаете с API изС 11 по 17:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2
        && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    setLayerType(LAYER_TYPE_SOFTWARE, null);
}

Я также окружил вызов clipPath() блоком try-catch, чтобы избежать непредвиденных сбоев приложения:API> = 18.

См. Неподдерживаемые операции рисования

...