android-seekbar event - Il pollice di Android SeekBar viene tagliato / tagliato



color styles (5)

Solo per chiarimenti.

In alcuni posti che ho visto

 android:thumbOffset="8dp"

e alcuni

android:thumbOffset="8px"

quindi ho guardato il codice sorgente. questo è lo stile originale

<style name="Widget.SeekBar">
        <item name="android:indeterminateOnly">false</item>
        <item name="android:progressDrawable">@android:drawable/progress_horizontal</item>
        <item name="android:indeterminateDrawable">@android:drawable/progress_horizontal</item>
        <item name="android:minHeight">20dip</item>
        <item name="android:maxHeight">20dip</item>
        <item name="android:thumb">@android:drawable/seek_thumb</item>
        <item name="android:thumbOffset">8dip</item>
        <item name="android:focusable">true</item>
    </style>

a partire dal

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/styles.xml

Quando si utilizza un pollice personalizzato estraibile con una vista SeekBar , il pollice che si può disegnare viene tagliato ai bordi sinistro e destro della vista.

Come posso risolvere questo comportamento?


Dovresti essere in grado di risolvere il problema impostando paddingLeft e paddingRight su SeekBar a metà larghezza del pollice (ricorda di usare unità indipendenti dalla densità). Puoi anche controllare lo spazio consentito ai bordi per il pollice di una barra di ricerca chiamando setThumbOffset .


Mi sono imbattuto in questo problema me stesso, e credo che la decisione "correct" sarebbe quella di modificare android:thumbOffset come lo stile predefinito per un SeekBar lo imposta su 8px.


Per default SeekBar ho usato queste impostazioni e funziona bene:

android:paddingLeft="6dp"
android:paddingRight="6dp"

android:thumbOffset="8dp"

Questa domanda è difficile da rispondere su . Prima di iniziare comunque, nota che le forme (drawRect () per esempio) NON hanno un colore intrinseco. Le informazioni sul colore provengono sempre dall'oggetto Paint.

Questo cancella un ovale. Prima che me ne accorgessi, il mio modello mentale era che il disegno su una tela (concettualmente) disegna su un "livello" separato e quindi quel livello è composto con la bitmap della tela usando la modalità di trasferimento di Paint. Se fosse così semplice, il codice precedente cancellerebbe l'intera Bitmap (all'interno dell'area di ritaglio) mentre CLEAR imposta sempre il colore (e l'alfa) su 0 indipendentemente dall'alpha della sorgente. Quindi questo implica che ci sia un ulteriore tipo di mascheramento in corso per limitare la cancellazione a un ovale.

La tua modella è un po 'spenta. L'ovale non viene disegnato in un livello separato (a meno che non si chiami Canvas.saveLayer ()), esso viene disegnato direttamente sulla bitmap di supporto della Canvas. La modalità di trasferimento di Paint viene applicata a ogni pixel disegnato dalla primitiva. In questo caso, solo il risultato della rasterizzazione di un ovale influisce sulla bitmap. Non c'è nessun mascheramento speciale in corso, l'ovale stesso è la maschera.

Comunque, ecco una visione semplificata della pipeline:

  1. Primitivo (retto, ovale, percorso, ecc.)
  2. PathEffect
  3. rasterizzazione
  4. MaskFilter
  5. Colore / Shader / colorfilter
  6. Xfermode

(Ho appena visto il tuo aggiornamento e sì, quello che hai trovato descrive le fasi della pipeline in ordine.)

La pipeline diventa un po 'più complicata quando si usano i livelli (Canvas.saveLayer ()), poiché la pipeline raddoppia. Per prima cosa passa attraverso la pipeline per rendere le tue primitive all'interno di una bitmap fuori schermo (il livello), e la bitmap fuori schermo viene quindi applicata alla tela passando attraverso la pipeline.





android android-seekbar