Affichage dynamique de seekbar
Bonjour,
Je cherche actuellement à afficher une seekbar lors de l'appuie sur une view (le progress actuelle) qui viendrait s'afficher sous le doigt et permettrait de modifier le progress sans avoir à lever le doigt, juste en glissant.
Actuellement j'arrive à afficher une seekbar avec le progress actuelle mais je suis obligé de lever le doigt pour que celle-ci commence à bouger...
J'ai essayé de donner le focus, d'utiliser setSelected(true) ainsi que quelques autres mais je n'arrive pas à trouver comment faire ou quel terme chercher sur google...
voilà ce que j'ai actuellement:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| viewHolderRelais.tv_prcDim.setOnTouchListener(new View.OnTouchListener() {
ViewGroup root;
float yOrigine;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
try {
root = (ViewGroup) v.getRootView();
if (root != null) {
final popup_SeekBar seek = new popup_SeekBar(root.getContext(), root, _progress);
seek.setListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
viewHolderRelais.tv_prc.setText(String.format(Locale.getDefault(),"%d%%",Math.round(progress*100f/64f)));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
clickTime = 1;
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mListener.onProgress(mItems.get(viewHolderRelais.getAdapterPosition()),seekBar.getProgress());
clickTime = 0;
seek.close();
}
});
yOrigine = event.getRawY();
seek.setTranslation(event.getRawX(),yOrigine);
}
} catch (ClassCastException ex) {
ex.printStackTrace();
return false;
}
break;
}
return true;
}
}); |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public class popup_SeekBar {
private ViewGroup layout;
private ViewGroup parent;
private SeekBar seek;
public popup_SeekBar(Context ctx, ViewGroup parent, int progress) {
this.parent = parent;
layout = (ViewGroup) View.inflate(ctx, R.layout.dialog_seekbar, parent);
layout = layout.findViewById(R.id.layoutSeekBar);
seek = layout.findViewById(R.id.seekBar);
seek.setProgress(progress);
}
public void setListener(SeekBar.OnSeekBarChangeListener listener){
seek.setOnSeekBarChangeListener(listener);
}
public void setTranslation(float x, float y){//On centre sur la position
layout.setTranslationX(x-200);//TODO a placer dans dimen
layout.setTranslationY(y-30);//TODO a placer dans dimen
}
public void close(){
parent.removeView(layout);
}
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/layoutSeekBar"
android:background="@drawable/bg_carre"
android:layout_height="60dp"
android:layout_width="400dp">
<SeekBar
android:id="@+id/seekBar"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_height="0dp"
android:layout_width="0dp"
android:max="64"/>
</androidx.constraintlayout.widget.ConstraintLayout> |
Lorsque je leve le doigt puis utilise la seekbar le pointeur bouge normalement et lorsque je releve le doigts la seekbar est supprimé après récupération du progress.