5

Questo codice disegna un singolo colore (con forma alfa) utilizzando il canale alfa di una bitmap.L'accelerazione dell'hardware a nido d'ape non sembra funzionare con setColorFilter

Bitmap alphaMask = bitmap.extractAlpha(); 
Paint paint = new Paint(); 
int color = Color.GRAY; 
... 
paint.setColor(color); 
paint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.DST_IN)); 
... 
canvas.drawBitmap(alphaMask, x, y, paint); 

Per esempio, ci vorrà la bitmap a sinistra e disegnare sulla tela, come appare sulla destra:

enter image description here

Tuttavia, non funziona su Honeycomb (Android 3.0) quando l'accelerazione hardware è attivata. Disegna la forma come nera, non importa cosa. Ignora il valore del colore. Tuttavia, funziona perfettamente su ICS (Android 4.0) con l'accelerazione hardware attivata.

So che alcune API non sono supportate con l'accelerazione hardware, come Romain Guy documented here, sotto Quali operazioni di disegno sono supportate?, ma non sembra che utilizzi nessuno di quelli menzionati come non supportato.

Inoltre, sembrava che dicesse che setColorFilter dovrebbe funzionare at this post.

C'è qualcosa nel mio codice che non è supportato in Honeycomb? Qualche soluzione alternativa? Mi piacerebbe lasciare l'accelerazione hardware in questo caso.

Grazie

risposta

6

Si è verificato un errore nel modo in cui Android 3.0 gestiva le bitmap alfa8. Sono terribilmente dispiaciuto per questo poiché è stata interamente colpa mia. Questo problema è stato tuttavia risolto in Android 4.0.

Esistono due possibili soluzioni: - Imposta un tipo di livello software sulla vista - Oppure crea la tua Bitmap personale e visualizza ciò che ti serve. È quindi possibile disegnare questa bitmap sopra la tela con accelerazione hardware.

+0

+1. Molto bella. Grazie per essere passato e facci sapere! :) – MrGomez

+1

Ehi, non preoccuparti, voi ragazzi avete fatto cose incredibili con Android, non c'è bisogno di scusarsi! In ogni caso, ho finito per seguire il percorso del disegno in una bitmap e quindi di disegnare la bitmap sulla tela accelerata dall'hardware come hai detto tu. Per me va bene! Grazie – cottonBallPaws

+0

@ littleFluffyKitty Sono contento che tutto abbia funzionato. Grazie, @RomainGuy! – MrGomez

4

credo che la risposta migliore qui sta per essere da Romain Guy. Quoth he:

Tuttavia, ciò che stai descrivendo dovrebbe funzionare bene. Sono supportate tutte le sfumature e tutte le modalità di fusione. Si prega di segnalare bug con casi di test riproducibili per qualsiasi problema riscontrato e li otterrò risolto.

Data questa affermazione, il comportamento che stai riscontrando è un bug. Questo è uno di quei casi in cui contacting the primary developer responsible è in realtà la migliore soluzione tecnica che può essere fornita.

Ha fatto inviare una soluzione, però:

ho controllato l'attuazione e il renderer hardware attualmente supporta solo shader di tipo diverso all'interno di un ComposeShader. Questo significa che è possibile utilizzare una sfumatura + una bitmap, ma non due bitmap o due gradienti . Si noti che per le viste che non sono supportate nell'hardware è possibile utilizzare setLayerType(LAYER_TYPE_SOFTWARE, null) per forzare per il rendering nel software.

Forse pubblicherà qui per illuminare ulteriormente tutti noi. He did. :)

+0

Grazie per le informazioni. Ho provato a impostare view.setLayerType (LAYER_TYPE_SOFTWARE, null) ma il canvas suDraw() riceve è ancora accelerato dall'hardware ('canvas.isHardwareAccelerated') e il codice produce ancora nei risultati errati. Sembra che la tela stessa non debba essere accelerata dall'hardware. – cottonBallPaws

+0

Qualcuno sa se c'è un modo per ottenere il rendering del rendering del canvas? – cottonBallPaws

+1

Imposta il tipo di livello su software. Se stai acquistando una tela hardware potresti impostare il livello sulla vista sbagliata. –