Los métodos getTop (), getLeft (), getX (), getY (), getWidth (), getHeight () de la vista de Android
Estoy escribiendo una aplicación de arrastrar y soltar y tengo muy confundido debido a algunos parámetros.
Por favor ayuda a averiguar.
- Android creando cadena de animación ViewPropertyAnimator
- Android - stackoverflow Error
- Cómo configurar el tamaño de la vista de superficie personalizada
- Vista superficial en capas en un FrameLayout en Android
- Cómo agregar vistas dentro de una vista personalizada?
En primer lugar, leí la documentación de la clase View
y obtuve las siguientes explicaciones.
getX() : The visual x position of this view, in pixels.
getY() : The visual y position of this view, in pixels.
getWidth() : Return the width of the your view.
getHeight() : Return the width of the your view.
getTop() : Top position of this view relative to its parent.
getLeft() : Left position of this view relative to its parent.
Ahora cuando terminamos con la documentación oficial, veamos qué tenemos.
Tengo una imagen con el tamaño original 500x500
llamado círculo.
Y aquí está la captura de pantalla real de mi aplicación
Aquí está el xml para el diseño
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <ImageView android:id="@+id/imageView1" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/circle" /> </LinearLayout>
Ahora lo que me preocupa. Cuando veo a mi gente, obtengo lo siguiente, lo que realmente me confunde.
No veo ningún problema con las getX()
y getY()
, porque en realidad me muestran dónde empieza la imagen.
Como dice la documentación, los getWidth()
y getHeight
devuelven el ancho y la altura de la vista, pero la ventana de reloj me dice que mi getWidth()
y getHeight
son 300, lo cual realmente no puedo entender, porque en mi XML, Los he fijado 100dp cada uno, así que las funciones me devuelven ellos en una medida diferente, y cómo lo convierto a dp.
Y finalmente, me dice que getTop()
y getLeft
son 700 y 300, y como dice la documentación, son la posición de la imagen relativa a su padre. ¿Pero no es mi padre el diseño lineal, así que qué significan estos números en el sentido de la colocación de la pantalla?
- Sincronizar la posición de dos vistas ScrollView
- Identificar el grupo al que se ha hecho clic en una lista expandibleListView
- Ver onDraw (Canvas c) versus dibujar (Canvas c) en android?
- Android - listview obtener la vista del artículo por posición
- ANR en SurfaceView en dispositivos específicos solamente - La única solución es un tiempo de sueño corto
- El método setLayoutParams () no funciona
- ExpandableListView muestra de Google
- Actualizar la posición de la vista debajo de otra vista en Android
Todos estos métodos de medición devuelven tamaños en píxeles ( px
), no píxeles de densidad ( dp
). Si desea convertirlo, puede obtener la densidad llamando a:
float density = getResources().getDisplayMetrics().density;
Y luego divida los valores que obtiene con la densidad proporcionada, por ejemplo:
int widthDp = (int)(img.getWidth() / density);
Puede obtener píxeles de dp con
float ht_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ht, getResources().getDisplayMetrics()); float wt_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, wt, getResources().getDisplayMetrics());
A partir de la pregunta de posicionamiento. getTop
y getLeft
son valores relativos y se basan en su padre. Dado que el único padre de su ImageView
es LinearLayout
, está posicionando efectivamente su ImageView
directamente debajo de la ActionBar
ToolBar
/ ActionBar
ToolBar
También no utilice una imagen para un círculo, usted puede dibujarla fácilmente con canvas.drawCircle toma mucho menos memoria.