Perché non è la mia scalabilità vettoriale disegnata come previsto?

Sto tentando di utilizzare disegni vettoriali nella mia applicazione Android. Da http://developer.android.com/training/material/drawables.html (mine di enfasi):

In Android 5.0 (API Level 21) e superiore, è ansible definire i disegni vettoriali, che scalano senza perdere la definizione.

  • android gonfia un layout contiene frammento
  • Traccia una durata della chiamata telefonica
  • Android ClassCastException M: FrameLayout $ LayoutParams non può essere lanciato in WindowManager $ LayoutParams
  • Ordinare i tipi di query sqlite Android ignorando il caso
  • Volley, Quante volte l'onResponse in ImageLoader.ImageListener ha chiamato
  • Android Studio e MonkeyTalk?
  • Utilizzando questo disegni:

    <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" /> 

    e questo ImageView:

     <ImageView android:layout_width="400dp" android:layout_height="400dp" android:src="@drawable/icon_bell"/> 

    produce questa image sfocata quando si cerca di visualizzare l'icona a 400dp (su un dispositivo mobile di circa 2015 ad alta resistenza che esegue lollipop):

    blurryBellIcon

    Cambiando la width e l'altezza nella definizione del vector disegnabile a 200dp migliora significativamente la situazione alla dimensione 400dp resa. Tuttavia, impostandolo come un disegni per un elemento TextView (cioè l'icona a sinistra del text) crea ora un'image enorme.

    Le mie domande:

    1) Perché c'è una specifica di width / altezza nel vector disegnabile? Ho pensato che l'integer punto di questi è che si scalano su e giù senza perdita di rendere la width e l'altezza senza significato nella sua definizione?

    2) È ansible utilizzare un unico disegni vettoriale che funziona come disegnabile 24dp su un TextView ma si scalda bene per utilizzare anche immagini di size maggiori? Ad esempio, come faccio a evitare la creazione di disegni vettoriali multipli di diverse size e invece di utilizzare uno che scala ai miei requisiti resi?

    3) Come faccio ad utilizzare efficacemente gli attributi width / height e qual è la differenza con viewportWidth / Height?

    Dettagli aggiuntivi:

    • Il dispositivo è in esecuzione API 22
    • Utilizzo di Android Studio v1.5.1 con Gradle versione 1.5.0
    • Manifest è compilare e il livello di objective 23, livello minimo 15. Ho anche cercato di spostare il livello minimo a 21, ma questo non ha fatto differenza.
    • Decompilare l'APK (con livello minimo impostato a 21) mostra una singola risorsa XML nella cartella disegnabile. Non vengono prodotte immagini rasterizzate.

  • Collegamento di collegamento a WebView di Android (collegamento di salto) non funzionante
  • Aggiunta di disegni a CirclePageIndicator
  • intent.getAction () restituisce NULL
  • TableLayout a 2 colonne con il 50% esattamente per each colonna
  • Aggiungi il collegamento di avvio di applicazioni in Eclipse?
  • Può qualcuno get questo custom AlertDialog per funzionare effettivamente?
  • 5 Solutions collect form web for “Perché non è la mia scalabilità vettoriale disegnata come previsto?”

    Qui ci sono nuove informazioni su questo problema:

    https://code.google.com/p/android/issues/detail?id=202019

    Sembra usando android:scaleType="fitXY" lo renderà scalare correttamente su Lollipop.

    Da un ingegnere Google:

    Ciao, fathemes sapere se scaleType = 'fitXY' può essere una soluzione per voi, per get un'image nitida.

    Il latte Vs Lollipop è dovuto ad un trattamento speciale di scalatura aggiunto in marshmallow.

    Inoltre, per i tuoi commenti: "Comportmento corretto: il disegno del vector dovrebbe scalare senza perdita di qualità, quindi se vogliamo utilizzare la stessa attività in 3 size diverse nella nostra applicazione, non dobbiamo duplicare vector_drawable.xml 3 volte con diversi taglie rigide. "

    Anche se sono del tutto concordo questo dovrebbe essere il caso, in realtà, la piattaforma Android ha preoccupazione di performance tale che non abbiamo ancora raggiunto il mondo ideale. Quindi è in realtà consigliabile utilizzare 3 diversi vector_drawable.xml per get performance migliori se siete sicuri di voler disegnare 3 diverse size nello schermo contemporaneamente.

    Il dettaglio tecnico è fondamentalmente che utilizziamo una bitmap sotto il hook per eseguire la cache del rendering complesso del path, in modo tale che possiamo get le migliori performance di ridisegnamento, al pari della ridefinizione di un tracciato bitmap.

    1) Perché c'è una specifica di width / altezza nel vector disegnabile? Ho pensato che l'integer punto di questi è che si scalano su e giù senza perdita di rendere la width e l'altezza senza significato nella sua definizione?

    Per versioni SDK inferiori ai 21 where il sistema di generazione deve generare immagini raster e come dimensione predefinita nei casi in cui non si specifica la width / altezza.

    2) È ansible utilizzare un singolo disegnatore vettoriale che funziona come disegnabile 24dp su un TextView e una grande image di width a schermo vicino?

    Non credo che questo sia ansible se devi anche specificare SDK less di 21.

    3) Come faccio ad utilizzare efficacemente gli attributi width / height e qual è la differenza con viewportWidth / Height?

    Documentazione: (in realtà non molto utile adesso che la riletto …)

    android:width

    Utilizzato per definire la width intrinseca del disegnatore. Questo support tutte le unità di dimensione normalmente specificate con dp.

    android:height

    Utilizzato per definire l'altezza intrinseca il dislivello. Questo support tutte le unità di dimensione normalmente specificate con dp.

    android:viewportWidth

    Utilizzato per definire la width dello spazio di visualizzazione. Viewport è fondamentalmente la canvas virtuale in cui vengono disegnati i routes.

    android:viewportHeight

    Utilizzato per definire l'altezza dello spazio di visualizzazione. Viewport è fondamentalmente la canvas virtuale in cui vengono disegnati i routes.

    Ulteriori documentazione:

    Android 4.4 (livello API 20) e inferiore non support i disegni vettoriali. Se il livello API minimo è impostato su uno di questi livelli di API, Vector Asset Studio indirizza Gradle anche per generare immagini raster del vector disegnabile per la compatibilità all'indietro. È ansible fare riferimento a risorse vettoriali come Drawable in codice Java o @drawable nel codice XML; quando l'applicazione viene eseguita, viene visualizzata automaticamente la corrispondente image vettoriale o raster a seconda del livello API.


    Modifica: Qualcosa di strano sta succedendo. Ecco i miei risultati nella versione 23 dell'emulatore SDK (il dispositivo di prova Lollipop + è morto in questo momento …):

    Buone campane su 6.x

    E nell'emulatore SDK versione 21:

    Campane maleducate su 5.x

    AppCompat 23.2 introduce disegni vettoriali per tutti i dispositivi che eseguono Android 2.1 e versioni successive. Le immagini sono scalate correttamente, indipendentemente dalla width / altezza specificate nel file XML del vector disegnato. Purtroppo, questa implementazione non viene utilizzata nel livello API 21 e superiori (a favore dell'implementazione nativa).

    La buona notizia è che possiamo forzare AppCompat per utilizzare la sua implementazione sui livelli di API 21 e 22. Le cattive notizie sono che dobbiamo usare la riflessione per farlo.

    Prima di tutto, assicurati di utilizzare l'ultima versione di AppCompat e di aver abilitato la nuova implementazione del vector:

     android { defaultConfig { vectorDrawables.useSupportLibrary = true } } dependencies { compile 'com.android.support:appcompat-v7:23.2.0' } 

    Quindi, chiamate useCompatVectorIfNeeded(); nella tua onCreate () applicazione:

     private void useCompatVectorIfNeeded() { int sdkInt = Build.VERSION.SDK_INT; if (sdkInt == 21 || sdkInt == 22) { //vector drawables scale correctly in API level 23 try { AppCompatDrawableManager drawableManager = AppCompatDrawableManager.get(); Class<?> inflateDelegateClass = Class.forName("android.support.v7.widget.AppCompatDrawableManager$InflateDelegate"); Class<?> vdcInflateDelegateClass = Class.forName("android.support.v7.widget.AppCompatDrawableManager$VdcInflateDelegate"); Constructor<?> constructor = vdcInflateDelegateClass.getDeclaredConstructor(); constructor.setAccessible(true); Object vdcInflateDelegate = constructor.newInstance(); Class<?> args[] = {String.class, inflateDelegateClass}; Method addDelegate = AppCompatDrawableManager.class.getDeclaredMethod("addDelegate", args); addDelegate.setAccessible(true); addDelegate.invoke(drawableManager, "vector", vdcInflateDelegate); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } 

    Infine, assicurati di utilizzare l' app:srcCompat invece di android:src per impostare l'image di ImageView:

     <ImageView android:layout_width="400dp" android:layout_height="400dp" app:srcCompat="@drawable/icon_bell"/> 

    I disegni di vector dovrebbero ora essere scalati correttamente!

    1) Perché c'è una specifica di width / altezza nel vector disegnabile? Ho pensato che l'integer punto di questi è che si scalano su e giù senza perdita di rendere la width e l'altezza senza significato nella sua definizione?

    Questa è solo la dimensione predefinita del vector nel caso in cui non lo definiti nella vista di layout. (vale a dire che si utilizza il contenuto dell'involucro per l'altezza e la width dell'image)

    2) È ansible utilizzare un singolo disegnatore vettoriale che funziona come disegnabile 24dp su un TextView e una grande image di width a schermo vicino?

    Sì, è ansible e non ho avuto alcun problema di ridimensionamento finché il dispositivo in esecuzione utilizza lollipop o superiore. Nelle API precedenti, il vector viene convertito in png per diverse size dello schermo quando si crea l'applicazione.

    3) Come faccio ad utilizzare efficacemente gli attributi width / height e qual è la differenza con viewportWidth / Height?

    Ciò influenza come viene utilizzato lo spazio attorno al tuo vector. vale a dire che puoi utilizzarlo per cambiare la "gravità" del vector all'interno della window di prospetto, rendere il vector un margine predefinito, lasciare alcune parti del vector fuori dalla visualizzazione, ecc … Normalmente, basta impostarli allo stesso dimensione.

    Cerco di questi modi ma purtroppo nessuno di essi ha lavorato. Provo fitXY in ImageView , provo a usare l' app:srcCompat ma non posso neppure usare. ma ho trovato un modo di trucco:

    impostare l'image Disegnabile allo background del tuo ImageView .

    Ma il punto di questo modo è le size delle viste. se il tuo ImageView ha size non corrette, il Drawable diventa Stretch. devi controllarla nelle versioni pre-lollipop o utilizzare alcune Views PercentRelativeLayout .

    Spero che sia utile.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.