android - parkour - vector free apk
Vector dibujable en la lista de capas en versiones anteriores de Android (4)
El soporte para VectorDrawble en versiones anteriores de Android es bastante limitado , suponiendo que use vectorDrawables.useSupportLibrary = true
:
Puede usar VectorDrawableCompat para volver al nivel de API 7 y AnimatedVectorDrawableCompat en todos los dispositivos que ejecuten Android 5.0 (nivel de API 11) y superior. La forma en que Android carga los elementos dibujables, no todos los lugares que aceptan una ID dibujable, como en un archivo XML, admite la carga de elementos vectoriales dibujables. El paquete android.support.v7.appcompat ha agregado una serie de características para facilitar el uso de los dibujos vectoriales. En primer lugar, cuando usa el paquete android.support.v7.appcompat con ImageView o con subclases como ImageButton y FloatingActionButton, puede usar el nuevo atributo app: srcCompat para hacer referencia a los dibujos vectoriales, así como cualquier otro dibujo disponible para Android: src
Incluso en el código, estás limitado:
Para cambiar los elementos dibujables en tiempo de ejecución, puede usar el método setImageResource () como antes. Usar AppCompat y app: srcCompat es el método más infalible para integrar vectores dibujables en su aplicación.
¿Qué puedes hacer?
Pocas soluciones posibles:
tiene dibujable alternativo para VectorDrawable que usa en LayerDrawable. Póngalo en res / drawable-xxhdpi, por ejemplo, y VectorDrawable en res / drawable-anydpi.
no use
vectorDrawables.useSupportLibrary = true
hasta que tenga la aplicación tenga un minSdk que sea capaz de usar VectorDrawable. Esto funcionará porque el IDE generará archivos PNG para usted.cree la layerList mediante programación (ejemplo here ), y para poner el VectorDrawable, use
AppCompatResources.getDrawable
. También puede hacerlo con XML, excepto la parte de poner VectorDrawable.
Por cierto, la razón por la que es limitado, es que Google no pudo hacerlo eficiente y sin problemas. Puede llegar a su intento original de tener soporte completo, usando AppCompatDelegate.setCompatVectorFromResourcesEnabled (true), pero como dicen los documentos, usted está tomando un developer.android.com/reference/android/support/v7/app/… :
Esta función está deshabilitada de manera predeterminada, ya que habilitarla puede causar problemas con el uso de la memoria y problemas al actualizar las instancias de configuración. Si actualiza la configuración manualmente, es probable que no desee habilitar esto. Has sido advertido .
En las nuevas versiones de Android, el siguiente código:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="#bdbdbd" />
<size
android:width="60dp"
android:height="60dp" />
</shape>
</item>
<item
android:drawable="@drawable/ic_library_books_black_24dp"
android:gravity="center"
android:width="40dp"
android:height="40dp"
>
</item>
</layer-list>
Produce este impecable .
Sin embargo, las versiones anteriores de Android (API 16 y 19, según lo que he probado) no me gustan en absoluto y recibo
E/AndroidRuntime: FATAL EXCEPTION: main
Process: package.app, PID: 11490
android.view.InflateException: Binary XML file line #26: Error inflating class ImageView
sobre la inflación. He usado app:srcCompat
para todas mis app:srcCompat
de app:srcCompat
por lo que no hay problema allí.
Los dibujos vectoriales estándar también funcionan bien, pero cuando se colocan en una layer-list
causan caos. ¿Hay alguna solución?
Esta respuesta se basa en el artículo AppCompat - Age of the Vectors de Chris Banes (que trabaja en la Biblioteca de soporte). Para esta pregunta, estamos buscando específicamente la sección titulada La forma ''mágica'' .
La falla que está experimentando es porque la biblioteca de soporte solo permite algunas formas de usar VectorDrawables por defecto, y la lista de capas no es una de ellas.
Hay un bloque de código específico que puede agregar a la parte superior de su Actividad para habilitar otro uso de VectorDrawable
como <layer-list>
:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
Nota: el artículo vinculado contiene un error tipográfico en este nombre de método, usando "FromSources", debe ser "FromResources" como se muestra arriba.
Deberá agregar esto a cada Actividad en la que desee usar dichos elementos dibujables, o tal vez incluirlo en una clase BaseActivity de la que se extiendan sus otras Actividades.
Según el artículo, esto significa que ahora funcionará lo siguiente:
DrawableContainers que hacen referencia a otros recursos dibujables que contienen solo un recurso vectorial.
... StateListDrawable ... InsetDrawable, LayerDrawable, LevelListDrawable y RotateDrawable.
Sin embargo, debe tenerse en cuenta que este método está muy bien redactado con la palabra ''puede'', esto puede funcionar y no está habilitado de forma predeterminada, así que tenga en cuenta y compruebe que realmente funciona para usted.
Ahora hay otra dimensión a esta pregunta, el crédito a otros usuarios Selim Ajimi y Rapunzel Van Winkle por abordar esto en sus respuestas. <layer-list>
tiene un comportamiento diferente entre las API, en particular los atributos de width
y height
de su <item>
solo se admiten en API 23+. Esta no es la causa de su bloqueo, ni hará que su aplicación se bloquee, pero significará que su imagen no tendrá el aspecto deseado una vez que la tenga funcionando en API anteriores.
De hecho, la sugerencia de Rapunzel Van Winkle parece ser una buena manera de posicionar correctamente el dibujo en las API (probado en API 16 y 24):
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="#bdbdbd" />
<size
android:width="60dp"
android:height="60dp" />
</shape>
</item>
<item
android:drawable="@drawable/ic_library_books_black_24dp"
android:top="10dp"
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
>
</item>
</layer-list>
Los atributos de ancho / alto para el vector dibujable en su lista de capas solo son compatibles con API 23 (Marshmallow) y superior. Si observa la lista de capas que se puede dibujar en el editor de Android Studio, estos atributos deberían tener bloques amarillos a su alrededor junto con una advertencia de que esto no funcionará de manera confiable en dispositivos más antiguos.
Pero creo que puedes deshacerte de la advertencia y lograr el mismo efecto de centrado como este:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="#bdbdbd" />
<size
android:width="60dp"
android:height="60dp" />
</shape>
</item>
<item
android:drawable="@drawable/ic_library_books_black_24dp"
android:top="10dp"
android:bottom="10dp"
android:left="10dp"
android:right="10dp">
</item>
</layer-list>
Probé esto en un viejo teléfono API 15 y funcionó bien. Espero que esto funcione para ti también.
Actualizar:
En una versión anterior de esta respuesta, vectorDrawables.useSupportLibrary = true
usar vectorDrawables.useSupportLibrary = true
con las listas de capas, porque causó bloqueos. Sin embargo, recientemente me enteré de una solución que parece solucionar el problema (a la vez que evita los archivos png generados de forma automática que el desarrollador de Android mencionó correctamente). Aquí hay un resumen de lo que se necesita hacer para que funcione correctamente:
Asegúrese de usar srcCompat en su xml.
<android.support.v7.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/layer_list_with_svg" />
Agregue ''vectorDrawables.useSupportLibrary'' a app / build.gradle
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
Agregue ''setCompatVectorFromResourcesEnabled (true)'' a onCreate
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
setContentView(R.layout.activity_main);
}
¿Por qué es necesario todo esto?
Como me lo explicó una persona con más conocimientos, esto tiene que ver con la forma en que Android carga los dibujos vectoriales compatibles. Si está usando vectorDrawables.useSupportLibrary = true
, las vistas de la imagen cargarán los VectorDrawableCompat
cuando use la app:srcCompat
. Cuando la lista de capas dibujable está inflada, no hay forma de que descubra cómo crear esos dibujos vectoriales referenciados. Pero si setCompatVectorFromResourcesEnabled
, intentará enganchar la carga del vector dibujable a un nivel mucho más bajo que las vistas de la imagen y su atributo app:srcCompat
, por lo que podrá averiguar cómo cargar los vectores dibujables a los que se hace referencia en la lista de capas.
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@[package:]drawable/drawable_resource"
android:id="@[+][package:]id/resource_name"
android:top="dimension"
android:right="dimension"
android:bottom="dimension"
android:left="dimension" />
</layer-list>
Como se puede ver here , no tiene atributos de ancho / alto ...
Puedes añadir Bitmap al elemento. Creo que esta es la mejor solución.