Ja, gibt es! Um programmgesteuert eine Ripple auszulösen, müssen Sie den Zustand RippleDrawable
mit setState()
setzen. Aufruf setVisible()
tut NICHT arbeiten!
Die Lösung
die Welligkeit zeigen Ihnen den Zustand versetzen müssen gleichzeitig gedrückt und aktiviert:
rippleDrawable.setState(new int[] { android.R.attr.state_pressed, android.R.attr.state_enabled });
Die Welligkeit wird so lange gezeigt werden, wie die Staaten sind einstellen. Wenn Sie die Welligkeit wieder ausblenden möchten setzen Sie den Zustand in einen leeren int[]
:
rippleDrawable.setState(new int[] { });
Sie den Punkt, von dem Set kann die Welligkeit ausgeht setHotspot()
durch den Aufruf.
Wie es
arbeitet Ich habe viel debuggt und studierte den Quellcode RippleDrawable
auf und ab, bis ich, dass die Welligkeit realisiert wird, in onStateChange()
tatsächlich ausgelöst. Der Aufruf setVisible()
hat keine Wirkung und bewirkt nie, dass tatsächlich eine Welligkeit auftritt.
Der relevante Teil des Quellcodes von RippleDrawable
ist dies:
@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;
}
Wie Sie beide sehen können, wenn das Attribut aktiviert und gedrückt eingestellt sind beide dann die Welligkeit und Hintergrund wird aktiviert und die Welligkeit sein angezeigt. Solange der fokussierte Zustand eingestellt ist, wird zusätzlich der Hintergrund aktiviert. Damit können Sie die Welligkeit auslösen und den Hintergrund unabhängig von der Farbe wechseln lassen. Wenn Sie interessiert sind, können Sie den gesamten Quellcode von RippleDrawable
here einsehen.
Nizza. Funktioniert die Animation wie ein Klick oder ein langer Klick (dh die Auswahl bleibt erhalten)? –
Sie sollten versuchen, Zeichenstatus programmgesteuert festzulegen. Wie: 'int [] state = new int [] {android.R.attr.state_pressed}' und 'ripple.setState (state);'. Ich habe nicht getestet, ob Sie es mit 'setVisible (true, true)' verbinden sollten. Weil das Zeichenprogramm bei Zustandsänderungen automatisch aktualisiert/animiert wird. –
Ich verstehe nicht. Können Sie bitte ein Beispiel für beide Verhaltensweisen posten? –