Подтвердить что ты не робот

Работа над Canvas.clipPath(), которая больше не поддерживается в android

От android 3.0 метод clipPath() больше не поддерживается в устройствах с включенным аппаратным ускорением (прочитайте это статья для более подробной информации).

Я работаю с холстом, и мне нужно рисовать округленное изображение. Любые идеи о том, как я могу это сделать?

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

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

4b9b3361

Ответ 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. Вы можете создать растровое изображение с кругом в нем, а затем нарисуйте изображение на холсте, используя такой режим, который бы закрепил ваше изображение с исходным контентом.