Estoy tratando de aplicar una animación a una vista en mi aplicación de Android después de crear mi actividad. Para hacer esto, necesito determinar el tamaño actual de la vista y luego configurar una animación para escalar del tamaño actual al nuevo tamaño. Esta parte debe hacerse en tiempo de ejecución, ya que la vista se escala a diferentes tamaños según la entrada del usuario. Mi diseño está definido en XML.
Esto parece una tarea fácil, y hay muchas preguntas SO al respecto, aunque ninguna resolvió mi problema, obviamente. Entonces quizás me estoy perdiendo algo obvio. Tengo una idea de mi punto de vista al:
ImageView myView = (ImageView) getWindow().findViewById(R.id.MyViewID);
Esto funciona bien, pero cuando se llama getWidth()
, getHeight()
, getMeasuredWidth()
, getLayoutParams().width
, etc, todos ellos de retorno 0. He intentado también manualmente llamando measure()
a la vista seguido por una llamada a getMeasuredWidth()
, pero que no tiene ningún efecto.
He intentado llamar a estos métodos e inspeccionar el objeto en el depurador en mi actividad onCreate()
y en onPostCreate()
. ¿Cómo puedo calcular las dimensiones exactas de esta vista en tiempo de ejecución?
fuente
match_parent
). En este caso, una solución más simple que se puede llamar de forma segura incluso antes de que se dibuje la Vista (por ejemplo, desde el método onCreate () de su Actividad) es usar Display.getSize (); consulte stackoverflow.com/a/30929599/5025060 para más detalles. Sé que esto no es lo que pidió @NikReiman, solo dejo una nota para aquellos que puedan usar este método más simple.Respuestas:
Use el ViewTreeObserver en la Vista para esperar el primer diseño. Solo después del primer diseño, getWidth () / getHeight () / getMeasuredWidth () / getMeasuredHeight () funcionará.
fuente
removeGlobalOnLayoutListener(this);
? porque está en desusoEn realidad, hay varias soluciones, según el escenario:
Uso de la muestra:
Si conoce el tamaño del contenedor:
Si escribe en Kotlin, puede usar la siguiente función, que detrás de escena funciona exactamente como la
runJustBeforeBeingDrawn
que he escrito:Tenga en cuenta que debe agregar esto a gradle (que se encuentra aquí ):
fuente
OnPreDrawListener
. Caso probado cuando desea ejecutar el código de ActivityonCreate()
e inmediatamente la aplicación en segundo plano. Fácil de repetir, especialmente en dispositivos más lentos. Si reemplazaOnPreDrawListener
conOnGlobalLayoutListener
- no verá el mismo problema.ViewTreeObserver
opost
, en mi caso, el número 2 ayudó (view.measure
).¿Llama
getWidth()
antes de que la vista se muestre en la pantalla?fuente
onSizeChange()
evento y conocer el tamaño real? Eso parece un poco exagerado ... aunque en este momento estoy desesperado solo para que el código funcione, así que vale la pena intentarlo.onPostCreate()
que se ejecuta después de que la vista se crea y se inicia por completo.Basado en el consejo de @ mbaird, encontré una solución viable subclasificando la
ImageView
clase y anulandoonLayout()
. Luego creé una interfaz de observador que implementó mi actividad y pasé una referencia a sí mismo a la clase, lo que le permitió contar la actividad cuando realmente había terminado el dimensionamiento.No estoy 100% convencido de que esta sea la mejor solución (de ahí que todavía no marque esta respuesta como correcta), pero funciona y, según la documentación, es la primera vez que se puede encontrar el tamaño real de una vista.
fuente
Aquí está el código para obtener el diseño anulando una vista si API <11 (API 11 incluye la función View.OnLayoutChangedListener):
fuente
Puedes consultar esta pregunta . Se puede utilizar el
View
's post () método.fuente
Use el siguiente código, se le da el tamaño de la vista.
fuente
Esto funciona para mí en mi
onClickListener
:fuente
También me ha perdido alrededor
getMeasuredWidth()
ygetMeasuredHeight()
getHeight()
ygetWidth()
durante mucho tiempo .......... más tarde me encontré que conseguir la anchura y la altura de la vista en laonSizeChanged()
que es la mejor manera de hacer esto ........ que pueda dinámicamente obtenga su ancho ACTUAL y la altura ACTUAL de su vista anulando elonSizeChanged(
método).podría echar un vistazo a esto que tiene un fragmento de código elaborado. Nueva publicación de blog: cómo obtener las dimensiones de ancho y alto de una vista personalizada (vista extendida) en Android http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html
fuente
Puede obtener tanto la posición como la dimensión de la vista en la pantalla
fuente
funciona a la perfección para mí:
fuente