android - studio - Equivalente de ImageView scaleType ''centerCrop'' a mapa de bits drawable gravedad
imageview android scale (4)
Creé una actividad con una imagen de encabezado. Esta imagen de encabezado se creó originalmente en el XML de diseño de la actividad utilizando un ImageView donde scaleType se establece en centerCrop. Esto hace lo que quiero, centra la imagen, recorte a la izquierda y a la derecha en modo retrato, mostrando todo en modo horizontal.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="30dp"
android:paddingBottom="6dp"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:background="#919EAC"
android:orientation="vertical" >
<ImageView
android:id="@+id/header_image"
android:layout_width="match_parent"
android:layout_height="120dp"
android:contentDescription="@string/header_description"
android:scaleType="centerCrop"
android:src="@drawable/header" />
.... <other views> ...
Me gustaría reemplazar esto con un fondo dibujable para que pueda usar el espacio de la imagen del encabezado para mostrar los datos, y me ahorra repetir el mismo diseño en las diferentes actividades.
Por esta razón, he creado un dibujable al que puedo referirme en el atributo android: background:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle" >
<solid android:color="#919EAC" />
</shape>
</item>
<item>
<bitmap
android:antialias="true"
android:gravity="top|center_horizontal"
android:src="@drawable/header" />
</item>
</layer-list>
Este dibujable define el fondo de color que, de lo contrario, definiría el diseño y define una imagen de encabezado que, de lo contrario, se incluiría en el diseño como un ImageView.
Sin embargo, ahora mi imagen está escalada, mientras que me gustaría que se recorta.
Comprobando la documentación de Android probé otros modos de gravedad como
android:gravity="top|clip_horizontal"
Pero todavía parece mostrar / escalar de forma diferente a la vista de la imagen.
¿Cuál sería la definición correcta del fondo dibujable?
No sé cómo hacerlo con el fondo. Puedes probar otras soluciones:
1) La solución más sencilla para mostrar algo en la parte superior de la imagen es ponerlos a ambos en un diseño para que se superpongan. Por ejemplo, puede usar un RelativeLayout con las dimensiones de ImageView, ImageView es match_parent en ambas dimensiones y una TextView en el centro.
2) Puede guardar Imageview en un diseño diferente, por ejemplo, header.xml, y usarlo incluyendo header.xml donde lo necesite.
3) Si el diseño que se mostrará encima de ImageView es el mismo en todas partes, puede crear un diseño personalizado con un ImageView y decir, un TextView en el centro, y usar ese diseño en todas partes. Puede establecer la cadena TextView en este diseño personalizado a continuación. Puede leer más sobre diseños personalizados, son fáciles.
Para centrar recortar un mapa de bits en el código, haga esto:
public static Bitmap cropCenter(Bitmap bmp) {
int dimension = Math.min(bmp.getWidth(), bmp.getHeight());
return ThumbnailUtils.extractThumbnail(bmp, dimension, dimension);
}
No sé de ninguna otra manera de centrar Recortar un bitmap xml sabio.
Espero que ayude a cualquiera.
Encontré esta solución en esta publicación: Android Crop Center of Bitmap
Resolví este problema con un decorador que mantiene la relación de aspecto del drawable subyacente: https://gist.github.com/rudchenkos/e33dc0d6669a61dde9d6548f6c3e0e7e
Desafortunadamente, no hay forma de aplicarlo desde XML, así que lo hago al comienzo de mi actividad de splash:
public class SplashActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Drawable bg = getResources().getDrawable(R.drawable.screen);
getWindow().setBackgroundDrawable(new CenterCropDrawable(bg));
...
}
}
Eso es más o menos equivalente a especificar el dibujable como android:windowBackground
en el tema Activity
Utilizando scaleType = "centerCrop"
estaba logrando el resultado que deseaba, recortando los bordes de la imagen y mostrando la parte central que correspondiera a ese tamaño .
Para ImageView:
ImageView
tiene el atributo scaleType
que funciona solo para la imagen que se establece como fuente para mostrar. es decir, como si fuera TextView
, Text
es su fuente.
Incluso es posible que haya notado que scaleType no funciona para la imagen configurada como fondo que solo funciona con la imagen que se proporciona como fuente en XML de en tiempo de ejecución.
Para el diseño
Layout
puede mostrar imágenes de fondo, pero no hay ningún atributo para el diseño que pueda procesar las imágenes de fondo y escalarlas según el valor del atributo.
Por lo tanto, debe dejar de solicitar la instalación de ImageView
desde Layout
, porque no lo tiene.
2 soluciones diferentes para su problema
1) Mantenga las imágenes adecuadas para el encabezado de fondo en diferentes carpetas dibujables y úselo, de esta manera no necesita escalar el tiempo de ejecución ya que ya desarrolló una imagen para el tamaño diferente.
2) Solo necesita rediseñar su XML, como debajo de la muestra
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:background="@drawable/subway"
android:scaleType="centerCrop" />
<Button
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
/>
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
/>
</RelativeLayout>