Я пытаюсь применить анимацию к представлению в моем приложении для Android после создания моего действия. Для этого мне нужно определить текущий размер представления, а затем настроить анимацию для масштабирования от текущего размера до нового. Эта часть должна выполняться во время выполнения, так как вид масштабируется до разных размеров в зависимости от ввода от пользователя. Мой макет определен в XML.
Это кажется легкой задачей, и по этому поводу есть много ТАК вопросов, хотя, очевидно, ни один из них не решил мою проблему. Так что, возможно, я упускаю что-то очевидное. Я понимаю свое мнение следующим образом:
ImageView myView = (ImageView) getWindow().findViewById(R.id.MyViewID);
Это работает отлично, но при вызове getWidth()
, getHeight()
, getMeasuredWidth()
, getLayoutParams().width
и т.д., они все возвращаются 0. Я также попытался вручную вызова measure()
на представлении с последующим вызовом getMeasuredWidth()
, но это не имеет никакого эффекта.
Я пробовал вызывать эти методы и проверять объект в отладчике в своей деятельности onCreate()
и в onPostCreate()
. Как я могу определить точные размеры этого представления во время выполнения?
источник
match_parent
). В этом случае более простым решением, которое можно безопасно вызвать даже до отрисовки View (например, из метода onCreate () вашего Activity), является использование Display.getSize (); подробнее см. stackoverflow.com/a/30929599/5025060 . Я знаю, что @NikReiman просил не об этом, просто оставил записку для тех, кто может использовать этот более простой метод.Ответы:
Используйте ViewTreeObserver в представлении, чтобы дождаться первого макета. Только после первого макета будет работать getWidth () / getHeight () / getMeasuredWidth () / getMeasuredHeight ().
источник
removeGlobalOnLayoutListener(this);
? потому что он устарел.На самом деле существует несколько решений, в зависимости от сценария:
Пример использования:
Если вы знаете размер контейнера:
Если вы пишете на Kotlin, вы можете использовать следующую функцию, которая негласно работает точно так же, как
runJustBeforeBeingDrawn
я написал:Обратите внимание, что вам нужно добавить это в gradle (можно найти здесь ):
источник
OnPreDrawListener
. Протестированный случай, когда вы хотите запустить код из ActivityonCreate()
и сразу запустить фоновое приложение. Легко повторить, особенно на более медленном устройстве. Если заменитьOnPreDrawListener
наOnGlobalLayoutListener
- такой же проблемы не будет.ViewTreeObserver
илиpost
, в моем случае помог номер 2 (view.measure
).Вы звоните
getWidth()
до того, как изображение фактически отобразится на экране?источник
onSizeChange()
событие и узнать его реальный размер? Это кажется излишним ... хотя на данный момент я отчаянно пытаюсь заставить код работать, так что попробовать стоит.onPostCreate()
который запускается после того, как представление полностью создано и запущено.Основываясь на совете @mbaird, я нашел работоспособное решение, создав подкласс
ImageView
класса и переопределивonLayout()
. Затем я создал интерфейс наблюдателя, который реализовал мое действие, и передал классу ссылку на себя, что позволило ему сообщить активности, когда она фактически закончила определение размера.Я не уверен на 100%, что это лучшее решение (поэтому я пока не помечаю этот ответ как правильный), но он действительно работает, и, согласно документации, это первый раз, когда можно найти фактический размер представления.
источник
Вот код для получения макета путем переопределения представления, если API <11 (API 11 включает функцию View.OnLayoutChangedListener):
источник
Вы можете проверить этот вопрос . Вы можете использовать
View
«S пост () метод.источник
Используйте приведенный ниже код, он дает размер представления.
источник
Это работает для меня в моем
onClickListener
:источник
Я также потерял около
getMeasuredWidth()
иgetMeasuredHeight()
getHeight()
и вgetWidth()
течение длительного времени .......... позже я обнаружил , что получение ширины и высоты мнения , вonSizeChanged()
это лучший способ сделать это ........ вы можете динамически получите ТЕКУЩУЮ ширину и ТЕКУЩУЮ высоту вашего представления, переопределивonSizeChanged(
метод).может захотеть взглянуть на это, в котором есть тщательно продуманный фрагмент кода. Новое сообщение в блоге: как получить размеры по ширине и высоте customView (расширяет View) в Android http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html
источник
Вы можете получить как положение, так и размер представления на экране
источник
у меня работает идеально:
источник