Sì, c'è! Per attivare un ripple programmaticamente, è necessario impostare lo stato di RippleDrawable
con setState()
. La chiamata setVisible()
fa NON lavoro!
La soluzione
Per mostrare il ripple è necessario impostare lo stato di premuto e ha permesso allo stesso tempo:
rippleDrawable.setState(new int[] { android.R.attr.state_pressed, android.R.attr.state_enabled });
L'ondulazione verrà mostrato purché tali Stati sono impostato. Quando si desidera nascondere il ripple di nuovo impostare lo stato a un vuoto int[]
:
rippleDrawable.setState(new int[] { });
È possibile impostare il punto da cui emana l'ondulazione chiamando setHotspot()
.
Come funziona
ho debug molto e studiato il codice sorgente di RippleDrawable
su e giù fino a quando mi sono reso conto che l'ondulazione viene effettivamente attivato in onStateChange()
. Chiamare setVisible()
non ha alcun effetto e non fa mai apparire alcun ripple.
La parte rilevante del codice sorgente di RippleDrawable
è questo:
@Override
protected boolean onStateChange(int[] stateSet) {
final boolean changed = super.onStateChange(stateSet);
boolean enabled = false;
boolean pressed = false;
boolean focused = false;
for (int state : stateSet) {
if (state == R.attr.state_enabled) {
enabled = true;
}
if (state == R.attr.state_focused) {
focused = true;
}
if (state == R.attr.state_pressed) {
pressed = true;
}
}
setRippleActive(enabled && pressed);
setBackgroundActive(focused || (enabled && pressed));
return changed;
}
Come si può vedere se sia il permesso e l'attributo pressato vengono impostate allora sia il ripple e lo sfondo saranno attivati e il ripple sarà visualizzato. Inoltre, finché si imposta lo stato attivo, verrà attivato anche lo sfondo. Con questo è possibile attivare l'ondulazione e avere lo sfondo cambiare colore in modo indipendente.
Se si è interessati è possibile visualizzare l'intero codice sorgente di RippleDrawable
here.
fonte
2015-05-04 08:46:45
Nizza. L'animazione funziona come un clic o un clic lungo (ovvero la selezione rimarrà)? –
Dovresti provare a impostare lo stato disegnabile a livello di codice. Come: 'int [] state = new int [] {android.R.attr.state_pressed}' e 'ripple.setState (stato);'. Non ho provato se dovessi accoppiarlo con 'setVisible (true, true)'. Poiché il drawable viene automaticamente aggiornato/animato in base alle modifiche dello stato. –
Non capisco. Puoi per favore postare un campione per entrambi i comportamenti? –