Aggiungi text dinamico sul pollice Android SeekBar

Sto cercando di fare questo personalizzato SeekBar in Android 2.2 e tutto quello che faccio sembra sbagliato! Sto cercando di visualizzare il valore della barra di ricerca sopra l'image del pollice del SeekBar. Qualcuno ha qualche esperienza con questo?

  • Android: Utilizzo di AUTO-CANCEL in una notifica quando l'applicazione è in esecuzione in background
  • fine chiamata in entrata programmaticamente
  • Scattare foto dalla camera in frammento
  • Come rilevare il telefono android sta spento?
  • Caricamento di grandi immagini senza OutOfMemoryError
  • Differenze tra TextTextChanged di TextWatcher, beforeTextChanged e AfterTextChanged
  • Come colbind Android a un server di database
  • Come controllare l'accesso a Internet su Android? InetAddress non esce mai
  • Disegno inclinato o inclinato dell'interface utente in Android
  • Android: ScrollView forza verso il basso
  • Sostituisci le stringhe di Android
  • Creazione di file più di 1 * .db con la libreria ORM greenDao android
  • 9 Solutions collect form web for “Aggiungi text dinamico sul pollice Android SeekBar”

    Suppongo che tu abbia già esteso la class base, quindi hai qualcosa di simile:

    public class SeekBarHint extends SeekBar { public SeekBarHint (Context context) { super(context); } public SeekBarHint (Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public SeekBarHint (Context context, AttributeSet attrs) { super(context, attrs); } } 

    Ora si ignora il metodo onDraw con un codice del proprio codice. Inserire quanto segue:

     @Override protected void onDraw(Canvas c) { super.onDraw(c); } 

    Ora, si desidera disegnare un text vicino al pollice, ma non esiste un modo conveniente per get la posizione x del pollice. Abbiamo solo bisogno di una piccola math.

     @Override protected void onDraw(Canvas c) { super.onDraw(c); int thumb_x = ( (double)this.getProgress()/this.getMax() ) * (double)this.getWidth(); int middle = this.getHeight()/2; // your drawing code here, ie Canvas.drawText(); } 
     seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean b) { int val = (progress * (seekBar.getWidth() - 2 * seekBar.getThumbOffset())) / seekBar.getMax(); text_seekbar.setText("" + progress); text_seekbar.setX(seekBar.getX() + val + seekBar.getThumbOffset() / 2); } @Override public void onStartTrackingTouch(SeekBar seekBar) { text_seekbar.setVisibility(View.VISIBLE); } @Override public void onStopTrackingTouch(SeekBar seekBar) { text_seekbar.setVisibility(View.GONE); } }); 

    Questo ha funzionato per me

     @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int val = (progress * (seekBar.getWidth() - 2 * seekBar.getThumbOffset())) / seekBar.getMax(); _testText.setText("" + progress); _testText.setX(seekBar.getX() + val + seekBar.getThumbOffset() / 2); } 

    Ehi ho trovato un'altra soluzione, sembra più semplice:

      private void setText(){ int progress = mSeekBar.getProgress(); int max= mSeekBar.getMax(); int offset = mSeekBar.getThumbOffset(); float percent = ((float)progress)/(float)max; int width = mSeekBar.getWidth() - 2*offset; int answer =((int)(width*percent +offset - mText.getWidth()/2)); mText.setX(answer); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { setText(); mText.setText(""+progress); } 

    Ho usato questa libreria per creare una vista di text disegnabile e mettere il disegno in pollice in modo programmato.

    https://github.com/amulyakhare/TextDrawable

    Il codice è qualcosa di simile:

     seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { String dynamicText = String.valueOf(progress); TextDrawable drawable = TextDrawable.builder() .beginConfig() .endConfig() .buildRoundRect(dynamicText , Color.WHITE ,20); seekBar.setThumb(drawable); } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); 

    Questo codice di seguito allinea il centro di TextView al centro del pollice SeekBar . La width YOUR_TEXT_VIEW deve essere wrap_content in xml.

    Spero che questo codice ti aiuterà.

     @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { YOUR_TEXT_VIEW.setText(Integer.toString(progress)); double pourcent = progress / (double) seekBar.getMax(); int offset = seekBar.getThumbOffset(); int seekWidth = seekBar.getWidth(); int val = (int) Math.round(pourcent * (seekWidth - 2 * offset)); int labelWidth = YOUR_TEXT_VIEW.getWidth(); YOUR_TEXT_VIEW.setX(offset + seekBar.getX() + val - Math.round(pourcent * offset) - Math.round(pourcent * labelWidth/2)); } 

    Ho seguito un approccio diverso che offre maggiori possibilità di personalizzare il pollice. L'output finale apparirà come segue:

    immettere qui la descrizione dell'immagine

    Innanzitutto bisogna disegnare il layout che sarà impostato come il disegno del pollice.

    layout_seekbar_thumb.xml

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="@dimen/seekbar_thumb_size" android:layout_height="@dimen/seekbar_thumb_size" android:background="@drawable/ic_seekbar_thumb_back" android:gravity="center" android:orientation="vertical"> <TextView android:id="@+id/tvProgress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" android:textColor="@color/appColorBlack" android:textSize="14sp" /> </LinearLayout> </LinearLayout> 

    Qui seekbar_thumb_size può essere qualsiasi dimensione piccola secondo il vostro requisito. Ho usato 30dp qui. Per lo background è ansible utilizzare qualsiasi disegno / icona di tua scelta.

    Ora avete bisogno di questa visualizzazione per essere impostato come un disegno a dischi in modo da ottenerlo con il seguente codice:

    View thumbView = LayoutInflater.from(YourActivity.this).inflate(R.layout.layout_seekbar_thumb, null, false);

    Qui suggerisco di inizializzare questa vista in onCreate() quindi non c'è bisogno di gonfiarlo di nuovo e di nuovo.

    Adesso puoi impostare questa visualizzazione come disegnabile quando si cambia il progresso di searchBar. Aggiungere il seguente metodo nel codice:

     public Drawable getThumb(int progress) { ((TextView) thumbView.findViewById(R.id.tvProgress)).setText(progress + ""); thumbView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); Bitmap bitmap = Bitmap.createBitmap(thumbView.getMeasuredWidth(), thumbView.getMeasuredHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); thumbView.layout(0, 0, thumbView.getMeasuredWidth(), thumbView.getMeasuredHeight()); thumbView.draw(canvas); return new BitmapDrawable(getResources(), bitmap); } 

    Ora chiamate questo metodo da onProgressChanged() .

     seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // You can have your own calculation for progress seekBar.setThumb(getThumb(progress)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); 

    Nota: call anche il metodo getThumb() quando si inizializza seekBar per inizializzarlo con il valore predefinito.

    Con questo approccio, puoi avere una vista personalizzata sul cambiamento di avanzamento.

    Non funziona male per me
    c'è un piccolo codice hard)
    si prega di scrivere miglioramenti che smbd può avere

     import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.support.v7.widget.AppCompatSeekBar; import android.util.AttributeSet; import android.util.TypedValue; public class CustomSeekBar extends AppCompatSeekBar { @SuppressWarnings("unused") private static final String TAG = CustomSeekBar.class.getSimpleName(); private Paint paint; private Rect bounds; public String dimension; public CustomSeekBar(Context context) { super(context); init(); } public CustomSeekBar(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CustomSeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init(){ paint = new Paint(); paint.setColor(Color.WHITE); paint.setStyle(Paint.Style.STROKE); paint.setTextSize(sp2px(14)); bounds = new Rect(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); String label = String.valueOf(getProgress()) + dimension; paint.getTextBounds(label, 0, label.length(), bounds); float x = (float) getProgress() * (getWidth() - 2 * getThumbOffset()) / getMax() + (1 - (float) getProgress() / getMax()) * bounds.width() / 2 - bounds.width() / 2 + getThumbOffset() / (label.length() - 1); canvas.drawText(label, x, paint.getTextSize(), paint); } private int sp2px(int sp) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics()); } } 

    Ho creato questo esempio per mostrare come dovrebbe essere supportta la visualizzazione di text a diversi tipi di size dello schermo e come calcolare la reale posizione del pollice perché a volte la posizione potrebbe essere 0.

     public class CustomProgressBar extends RelativeLayout implements AppCompatSeekBar.OnSeekBarChangeListener { @BindView(R.id.userProgressBar) protected AppCompatSeekBar progressSeekBar; @BindView(R.id.textPorcent) protected TextView porcent; @BindView(R.id.titleIndicator) protected TextView title; public CustomProgressBar(Context context) { super(context); init(); } public CustomProgressBar(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.custom_progressbar_view, this, true); ButterKnife.bind(this); setColors(R.color.green, R.color.progress_bar_remaining); progressSeekBar.setPadding(0, 0, 0, 0); progressSeekBar.setOnSeekBarChangeListener(this); } private void setPorcentTextViewPosition(float widthView) { int width = CoreUtils.getScreenSize().x; float xPosition = ((float) progressSeekBar.getProgress() / 100) * width; float finalPosition = xPosition - (widthView / 2f); if (width - xPosition < widthView) { porcent.setX(width - widthView); } else if (widthView < finalPosition) { porcent.setX(finalPosition); } } public void setColors(int progressDrawable, int remainingDrawable) { LayerDrawable layer = (LayerDrawable) progressSeekBar.getProgressDrawable(); Drawable background = layer.getDrawable(0); Drawable progress = layer.getDrawable(1); background.setColorFilter(ContextCompat.getColor(getContext(), remainingDrawable), PorterDuff.Mode.SRC_IN); progress.setColorFilter(ContextCompat.getColor(getContext(), progressDrawable), PorterDuff.Mode.SRC_IN); } public void setValues(int progress, int remaining) { int value = (progress * remaining) / 100; progressSeekBar.setMax(remaining); porcent.setText(String.valueOf(value).concat("%")); porcent.post(new Runnable() { @Override public void run() { setPorcentTextViewPosition(porcent.getWidth()); } }); progressSeekBar.setProgress(value); } public void setTitle(String title) { this.title.setText(title); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.