2012-01-17 17 views
23

Da Android 3.0 il metodo clipPath() non è più supportato nei dispositivi con l'accelerazione hardware attivata (leggi questo article per maggiori dettagli).Work around Canvas.clipPath() che non è più supportato in Android

Sto lavorando con la tela e ho bisogno di disegnare un'immagine arrotondata. Qualche idea su come posso farlo?

* Non riesco a disattivare l'accelerazione hardware, sto cercando un'altra soluzione.

Risposta: Tnx @Malcolm per la risposta. Ho trovato un buon esempio che dimostra this technique, è fondamentalmente una maschera.

risposta

24

Canvas.clipPath() il supporto con accelerazione hardware è stato reintrodotto dal API 18.

Il miglior modo per aggirare il problema sta chiamando setLayerType(View.LAYER_TYPE_SOFTWARE, null) solo quando si esegue l'API 11-17:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2 
     && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    setLayerType(LAYER_TYPE_SOFTWARE, null); 
} 

Ho anche circondato la chiamata clipPath() con un blocco try-catch per evitare app imprevisti si blocca:

if (doClip) { 
    try { 
     canvas.clipPath(clipPath); 
    } catch (UnsupportedOperationException e) { 
     Log.e(TAG, "clipPath() not supported"); 
     doClip = false; 
    } 
} 

in ogni caso, UnsupportedOperationException non dovrebbe mai essere gettata sul API> = 18.

Vedi Unsupported Drawing Operations

+0

Non è esattamente la stessa cosa dell'altra risposta, tranne il fatto che l'API 18 ha introdotto il supporto hardware per questo? Quest'ultimo dovrebbe essere aggiunto, ovviamente. – Malcolm

+0

Sì, lo è ... Ma ho aggiunto il livello API 18 informazioni, spiegazioni ed esempi di codice ... Tutto in una breve risposta. – araks

39

clipPath con l'accelerazione hardware è supportato solo in livello API 18 e versioni successive, nei livelli API da 11 a 17 deve essere disattivato.

L'articolo che hai citato contiene un indizio:

Se l'applicazione è affetto da una qualsiasi di queste caratteristiche mancanti o limitazioni, è possibile disattivare l'accelerazione hardware per solo la parte interessata dell'applicazione chiamando setLayerType(View.LAYER_TYPE_SOFTWARE, null). In questo modo, puoi comunque sfruttare l'accelerazione hardware ovunque. Vedere Controlling Hardware Acceleration per ulteriori informazioni su come abilitare e disabilitare l'accelerazione hardware a diversi livelli nell'applicazione.

L'idea principale è quella di disabilitare l'accelerazione hardware nella parte dell'applicazione in cui è necessario utilizzare i metodi non supportati su dispositivi con livello di API inferiore a 18. Si può farlo per una vista particolare, non c'è è necessario spegnerlo completamente per l'intera applicazione.

Se non si desidera disattivare l'accelerazione hardware, suggerirei di utilizzare le modalità Porter-Duff. Puoi creare una bitmap con un cerchio al suo interno, quindi disegnare la tua immagine sulla tela usando una modalità tale da ritagliare l'immagine al contenuto originale.

+1

Sì, ma ho solo una vista, (questo è solitamente quello che hai quando lavori con la tela ...) Quindi non posso spegnerlo, questo è il motivo per cui sto cercando un modo per aggirare la soluzione. –

+0

"Non è più supportato, non è disponibile solo con l'accelerazione hardware attivata." I doppi negativi qui rendono questa frase difficile da leggere. Forse riformulare qualcosa del tipo: "' ClipPath' è disponibile solo con l'accelerazione hardware disattivata. " –

+0

@LeoAccend Perché non suggerisci tu stesso [suggerire una modifica] (http://stackoverflow.com/help/editing)? – Malcolm

Problemi correlati