Tak, jest! Aby aktywować programowanie, należy ustawić stan urządzenia RippleDrawable
na setState()
. Dzwonienie pod numer setVisible()
robi NOT działa!
Rozwiązanie
Aby pokazać tętnienia trzeba ustawić stan na prasowane i włączone w tym samym czasie:
rippleDrawable.setState(new int[] { android.R.attr.state_pressed, android.R.attr.state_enabled });
tętnienia zostaną pokazane tak długo jak te stany są zestaw. Gdy chcesz ukryć tętnienia ponownie ustawić stan do pustej int[]
:
rippleDrawable.setState(new int[] { });
Można ustawić punkt, z którego szmer rozchodzący wywołując setHotspot()
.
Jak to działa
Mam debugowany dużo studiował kodu źródłowego RippleDrawable
w górę iw dół, aż zdałem sobie sprawę, że tętnienia jest rzeczywiście wywołane w onStateChange()
. Wywołanie setVisible()
nie daje żadnego efektu i nigdy nie powoduje pojawiania się żadnych zmarszczek.
Odpowiedni fragment kodu źródłowego RippleDrawable
to:
@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;
}
Jak widać, jeśli oba włączone i przycisnął atrybut jest ustawiony to zarówno tętnienia i tło zostanie aktywowane i tętnienia będzie wystawiany. Dodatkowo tak długo, jak ustawiasz stan skupienia, tło również zostanie aktywowane. Dzięki temu możesz wywołać falowanie i niezależnie zmienić kolor tła.
Jeśli jesteś zainteresowany, możesz wyświetlić cały kod źródłowy RippleDrawable
here.
Nicea. Czy animacja działa jak kliknięcie lub długie kliknięcie (co oznacza, że zaznaczenie pozostanie)? –
Powinieneś spróbować programowo ustawić stan rysowania. Podobnie jak: 'int [] state = new int [] {android.R.attr.state_pressed}' i 'ripple.setState (state);'. Nie testowałem, jeśli powinieneś połączyć go z 'setVisible (true, true)'. Ponieważ losowanie jest automatycznie aktualizowane/animowane po zmianach stanu. –
Nie rozumiem. Czy możesz wysłać próbkę dla obu zachowań? –