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

View.isHardwareAccelerated() всегда false

У меня есть представление, которое аппаратно ускорено на многих устройствах. В этом представлении мне нужно проверить, используется ли аппаратное ускорение. Согласно документации Android SDK, это делается с помощью View.isHardwareAccelerated(). Интересно то, что при тестировании на устройствах, поддерживающих аппаратное ускорение, этот метод всегда возвращает значение false, даже если сами представления на самом деле становятся аппаратно ускоренными. (Я окончательно подтвердил это) Это становится более запутанным:

Если я звоню в View.getLayerType(), я вижу, что он всегда установлен в View.LAYER_TYPE_NONE. Если я позвоню на View.setLayerType(View.LAYER_TYPE_SOFTWARE), я могу эффективно отключить аппаратное ускорение. Я могу снова включить его, вызвав либо View.setLayerType(View.LAYER_TYPE_HARDWARE) OR View.setLayerType(View.LAYER_TYPE_NONE). Почему View.LAYER_TYPE_NONE включить аппаратное ускорение???

Перемещение для устройств, поддерживающих ускорение hw, похоже, я могу просто проверить статус, установив, установлен ли или нет View.LAYER_TYPE_SOFTWARE, однако у меня есть подозрения, что этот метод не будет работать на устройствах, которые не поддерживают ускорение hw, Я хотел бы знать, злоупотребляю ли я View.isHardwareAccelerated() или просто сломался.

EDIT: Я думаю, что я немного ближе к пониманию проблемы. Этот вопрос также был полезен:

Обнаружение ускорения оборудования во время выполнения: Android

Моя теория работы заключается в том, что представление еще не знает, было ли это аппаратное ускорение или нет, когда он вызван конструктором, и именно там я делаю свой чек. Если это так, мне интересно, что я могу переопределить в своем классе, который расширяет представление, что позволит мне успешно проверять аппаратное ускорение. Я подозреваю, что View.onSizeChanged(...) будет работать, но я бы хотел избежать использования того, что потенциально можно назвать много раз.

ИЗМЕНИТЬ № 2: Похоже на это. Я перевел свой чек в View.onSizeChanged(), и теперь он корректно сообщает. Мне все еще интересно, есть ли лучшее место в моем представлении, но я могу переместить эту проверку.

4b9b3361

Ответ 1

Я обдумывал это какое-то время. Приятно видеть, что вы поняли, в чем проблема. Документация правильно описывает это, но это не очень понятно. "Возвращает: True, если в окне прикреплено , а окно аппаратно ускорено"

Ответ 2

Как сообщает Diane Hackborn в этом посте: https://groups.google.com/forum/#!topic/android-developers/vAH0HAZg0uU

Вы должны проверить isHardwareAccelerated() после того, как представление было прикреплено к окну - например. в onAttachedToWindow()!