Работа над Canvas.clipPath(), которая больше не поддерживается в android
От android 3.0 метод clipPath() больше не поддерживается в устройствах с включенным аппаратным ускорением (прочитайте это статья для более подробной информации).
Я работаю с холстом, и мне нужно рисовать округленное изображение. Любые идеи о том, как я могу это сделать?
* Я не могу отключить аппаратное ускорение, я ищу другое решение.
Ответ:
Tnx @Malcolm за ваш ответ. Я нашел хороший пример, демонстрирующий эту технику, это в основном маска.
Ответы
Ответ 1
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, чтобы избежать непредвиденных сбоев приложений:
if (doClip) {
try {
canvas.clipPath(clipPath);
} catch (UnsupportedOperationException e) {
Log.e(TAG, "clipPath() not supported");
doClip = false;
}
}
В любом случае, UnsupportedOperationException никогда не должно быть брошено на API >= 18.
См. Неподдерживаемые операции рисования
Ответ 2
clipPath
с аппаратным ускорением поддерживается только в уровне API 18 и выше, на уровнях API от 11 до 17 он должен быть отключен.
В статье, которую вы упомянули, содержится ключ:
Если на ваше приложение влияет какая-либо из этих недостающих функций или ограничений, вы можете отключить аппаратное ускорение только для затронутой части вашего приложения, вызвав setLayerType (View.LAYER_TYPE_SOFTWARE, null ). Таким образом, вы все равно можете использовать аппаратное ускорение везде. Подробнее см. "Управление ускорением аппаратного обеспечения" , чтобы узнать, как включить и отключить аппаратное ускорение на разных уровнях вашего приложения.
Основная идея здесь - отключить аппаратное ускорение в той части приложения, где вам необходимо использовать неподдерживаемые методы на устройствах с уровнем API ниже 18. Вы можете сделать это для определенного вида, нет необходимости поворачивать это полностью для всего приложения.
Если вы не хотите отключать аппаратное ускорение, я бы предложил использовать режимы Porter-Duff. Вы можете создать растровое изображение с кругом в нем, а затем нарисуйте изображение на холсте, используя такой режим, который бы закрепил ваше изображение с исходным контентом.