Autore Topic: custom SeekBar non funziona correttamente  (Letto 664 volte)

Offline MasterChief

  • Utente junior
  • **
  • Post: 83
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus X
  • Sistema operativo:
    windows 10
custom SeekBar non funziona correttamente
« il: 29 Gennaio 2014, 22:46:55 CET »
0
Ciao a tutti ho bisogno di implementare una SeekBar verticale e in un link l'ho trovata e questo è il codice
Codice (Java): [Seleziona]
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.SeekBar;

public class VerticalSeekBar extends SeekBar {

    public VerticalSeekBar(Context context) {
        super(context);
    }

    public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public VerticalSeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(h, w, oldh, oldw);
    }

    @Override
    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(heightMeasureSpec, widthMeasureSpec);
        setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
    }

    protected void onDraw(Canvas c) {
        c.rotate(-90);
        c.translate(-getHeight(), 0);

        super.onDraw(c);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (!isEnabled()) {
            return false;
        }

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                setProgress(getMax() - (int) (getMax() * event.getY() / getHeight()));
                onSizeChanged(getWidth(), getHeight(), 0, 0);
                break;

            case MotionEvent.ACTION_CANCEL:
                break;
        }
        return true;
    }
}

il suo relativo xml è il seguente:
Codice (XML): [Seleziona]
 <android.components.VerticalSeekBar
      android:id="@+id/vsb1"
       android:layout_width="30sp"
       android:layout_height="250sp"
       android:layout_margin="10dp"
       android:progress="0"
       android:max="100"
       android:progressDrawable="@drawable/progressbar"
       android:secondaryProgress="0"
       android:indeterminate="false"
       android:minHeight="15sp"
       android:maxHeight="15sp"/>

Ho dunque creato una activity dove inserisco una VerticalSeekBar e una SeekBar normale, il problema sta nel fatto che la SeekBar normale funziona alla grande infatti nel metodo onStopTrackingTouch() riesco a far visualizzare un Toast, cosa che non accade nella mia VerticalSeekBar. Però dato che la classe VerticalSeekBar estende SeekBar non dovrei avere tutti i metodi della classe madre disponibili e quindi poter usare gli stessi nomi?
Nel codice seguente il setOnSeekBarChangeListener() non mi da lo stesso risultato:
Codice (Java): [Seleziona]
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.SeekBar;
import android.widget.Toast;
import android.components.VerticalSeekBar;

public class SeekTest extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.l_seek_test);

        VerticalSeekBar volumeControl = (VerticalSeekBar) findViewById(R.id.vsb1);
        SeekBar sb = (SeekBar) findViewById(R.id.volume_bar);


        volumeControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            int progressChanged = 0;

            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){
                progressChanged = progress;
            }

            public void onStartTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub
            }

            public void onStopTrackingTouch(SeekBar seekBar) {
                Toast.makeText(SeekTest.this, "seek bar progress:" + progressChanged, Toast.LENGTH_LONG).show();
            }
        });

        sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            int progressChanged = 0;

            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){
                progressChanged = progress;
            }

            public void onStartTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub
            }

            public void onStopTrackingTouch(SeekBar seekBar) {
                Toast.makeText(SeekTest.this, "seek bar progress:" + progressChanged, Toast.LENGTH_LONG).show();
            }
        });

    }

Credo di perdermi in un bicchiere d'acqua ma non ne vengo fuori  ???
Avete idee di come risolvere questa cosa?  :-) grazie per l'attenzione  :-)

iClaude

  • Visitatore
Re:custom SeekBar non funziona correttamente
« Risposta #1 il: 30 Gennaio 2014, 10:56:18 CET »
+1
Per prima cosa nella classe della Seekbar inserisci questo codice per aver accesso all'interfaccia:

private OnSeekBarChangeListener onChangeListener;
   @Override
   public void setOnSeekBarChangeListener(OnSeekBarChangeListener onChangeListener){
      this.onChangeListener = onChangeListener;
   }

Quindi nell'evento ACTION_UP inserisci
onChangeListener.onStopTrackingTouch(this);


Cmq qua trovi un'implementazione più completa
Working Vertical SeekBar for Android | hackskrieg

Offline MasterChief

  • Utente junior
  • **
  • Post: 83
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus X
  • Sistema operativo:
    windows 10
Re:custom SeekBar non funziona correttamente
« Risposta #2 il: 30 Gennaio 2014, 11:49:25 CET »
0
Grazie per la risposta  :-) ho apportato le modifiche, ma ora viene fuori Gradle project sync failed e il bello è che non ho fatto nulla. Appena riesco a farlo andare e vedo che funziona metterò "topic risolto".

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:custom SeekBar non funziona correttamente
« Risposta #3 il: 30 Gennaio 2014, 12:02:44 CET »
0
Grazie per la risposta  :-) ho apportato le modifiche, ma ora viene fuori Gradle project sync failed e il bello è che non ho fatto nulla. Appena riesco a farlo andare e vedo che funziona metterò "topic risolto".
hai provato a premere il pulsante di sync gradle (mi pare il primo con il simbolo di gradle con una freccia)?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline MasterChief

  • Utente junior
  • **
  • Post: 83
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus X
  • Sistema operativo:
    windows 10
Re:custom SeekBar non funziona correttamente
« Risposta #4 il: 30 Gennaio 2014, 12:06:20 CET »
0
Si si le ho provate tutte, sia il bottone che cancellare la cartella .gradle così se la riscarica lui ma non cambia niente e fino a ieri sera quando ho aperto questo topic funzionava... sono tentato a disinstallare e reinstallare tutto anche se non so se possa cambiare qualcosa

Edit 1: Mi sono spostato sul portatile e qua funziona tutto quanto, ho testato la soluzione che mi ha proposto iCalude e ora il Toast viene visualizzato però il valore "progress" rimane sempre a 0 e vengono visualizzati 2 Toast con scritto "seekbar  progress:0" in ogni punto in cui io lascio il Thumb bella VerticalSeekBar e il codice è sempre quello postato all'inizio con l'aggiunta della modifica di iCalude

Edit2: Niente da fare, ho eliminato il progetto tenendomi i codici e ne ho ricreato uno e ora funziona tutto, soluzione estrema ma funzionante
« Ultima modifica: 01 Febbraio 2014, 09:56:11 CET da Nic, Reason: A mali estremi, estremi rimedi ;) »