2013-08-23 3 views
9

Ich möchte Vertical seekBar wie unten Bild (für Android 4.O +)). es ist in Google Play Music App.Android Vertical Seek Bar wie Google Play Music App

enter image description here

Ich habe unten Art und Weise versucht: aber ich & Breite

<SeekBar 
    android:id="@+id/seekBar1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:rotation="270" 
    /> 

wollen nicht gesetzt Höhe kann ich wie folgt:

enter image description here

i jetzt habe dieses Stack Answer verwendet, aber es ist zu schwer zu ma nage mehrere vertikale Suchleiste.

i als dies für eine bessere Art und Weise suchen.


EDIT:

i unten Code verwendet haben, von iDroid Explorer's answer versuchen vertikal angezeigt Suchleiste:

private void setupEqualizerFxAndUI() { 

     for (short i = 0; i < 5; i++) { 

      LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, 
        ViewGroup.LayoutParams.MATCH_PARENT); 
      layoutParams.weight = 3; 

      LinearLayout row = new LinearLayout(this); 
      row.setOrientation(LinearLayout.VERTICAL); 
      row.setLayoutParams(layoutParams); 

      TextView minDbTextView = new TextView(this); 
      minDbTextView.setLayoutParams(new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT)); 
      minDbTextView.setText(i + " dB"); 

      TextView maxDbTextView = new TextView(this); 
      maxDbTextView.setLayoutParams(new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT)); 
      maxDbTextView.setText(i + " dB"); 

      LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT); 
      layoutParams1.weight = 2; 

      SeekBar bar = new SeekBar(this); 
      bar.setLayoutParams(layoutParams1); 
      bar.setMax(100); 
      bar.setProgress(20); 
      bar.setRotation(270); 
      bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
       public void onProgressChanged(SeekBar seekBar, int progress, 
         boolean fromUser) { 

       } 

       public void onStartTrackingTouch(SeekBar seekBar) { 
       } 

       public void onStopTrackingTouch(SeekBar seekBar) { 
       } 
      }); 

      row.addView(minDbTextView); 
      row.addView(bar); 
      row.addView(maxDbTextView); 

      mLinearLayout.addView(row); 

     } 
    } 

aber es sieht aus wie folgt: Anzeige wird nicht geschaltet.

enter image description here

Wenn ich nur ein seekBar dann sein Aussehen wie unten:

enter image description here

es gleiche wie Verwendung: android:rotation="270" in Layout-Datei.

+0

eine benutzerdefinierte Klasse erstellen, die die seekbar erstreckt, und dann so viele vertikale seekbar erstellen Sie –

+0

@Dhawal Sodha: Können Sie mir bitte sagen, welche Schwierigkeiten Sie bei der Umsetzung meines Codes konfrontiert sind? oder funktioniert mein Code für dich? –

+0

Die nativen Berührungsereignisse von Android funktionieren sehr gut, um benutzerdefinierte Ansichten mit einer Ziehfunktion zu erstellen, wobei die Konzepte 'Startposition', 'Delta' und 'Endposition' verwendet werden. Die Android-API ist sehr klar und stabil bei der Handhabung von Berührungsereignissen, was die erforderliche Logik zu einem Kinderspiel macht. –

Antwort

6

Haben überprüfen Sie die Android-Beispielcode von AudioFXDemo? Wenn nicht, dann überprüfen Sie bitte, ob es für Sie hilfreich ist oder nicht.

Es gibt Equalizer, die gleiche ist, wie Google Music App haben.

prüfen Code unten in diesem Demo-Beispiel:

private void setupEqualizerFxAndUI() { 
     // Create the Equalizer object (an AudioEffect subclass) and attach it to our media player, 
     // with a default priority (0). 
      try { 
      System.out.println("setupEqualizerFxAndUI eEqualizer is: "+mEqualizer); 
      System.out.println("setupEqualizerFxAndUI mIRemoteService: "+mIRemoteService); 
      mEqualizer = new Equalizer(0,mIRemoteService.getAudioSessionId()); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (UnsupportedOperationException e) { 
      e.printStackTrace(); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } catch (RuntimeException e) { 
      e.printStackTrace(); 
     } // Error in this line 

     if(onOffBtn.isChecked()){ 
      mEqualizer.setEnabled(true); 
     } 

     short bands = 5 ; 
     //System.out.println("bands are: "+bands); 

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); 
     params.weight = 1; 

     LinearLayout newOne = new LinearLayout(this); 
     newOne.setLayoutParams(params); 
     newOne.setOrientation(LinearLayout.HORIZONTAL); 

     final short minEQLevel = mEqualizer.getBandLevelRange()[0]; 
     final short maxEQLevel = mEqualizer.getBandLevelRange()[1]; 

     //System.out.println("Minimum value::: "+minEQLevel); 
     //System.out.println("Maximum value::: "+maxEQLevel); 

     //VerticalSeekBar[] bar = new VerticalSeekBar[5]; 

     for (short i = 0; i < bands; i++) { 
      final short band = i; 

      /* TextView freqTextView = new TextView(this); 
      freqTextView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
      freqTextView.setGravity(Gravity.CENTER_HORIZONTAL); 
      freqTextView.setText((mEqualizer.getCenterFreq(band)/1000) + " Hz"); 
      newOne.addView(freqTextView);*/ 

      LinearLayout row = new LinearLayout(this); 

      row.setOrientation(LinearLayout.VERTICAL); 

      TextView minDbTextView = new TextView(this); 
      minDbTextView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)); 
      minDbTextView.setText((minEQLevel/100) + " dB"); 
      minDbTextView.setTextColor(0xff000000); 

      TextView maxDbTextView = new TextView(this); 
      maxDbTextView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
      maxDbTextView.setText((maxEQLevel/100) + " dB"); 
      maxDbTextView.setTextColor(0xff000000); 

      LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 300); 
      layoutParams.setMargins(0, 10, 0, 10); 

//-------------------------- 

      // setClassicTone(maxEQLevel, minEQLevel); 

      VerticalSeekBar bar = new VerticalSeekBar(this); 

      bar = new VerticalSeekBar(this); 
      bar.setLayoutParams(layoutParams); 
      bar.setMax(maxEQLevel - minEQLevel); 
      bar.setProgress(mEqualizer.getBandLevel(band)); 
      //bar.setMax(3000); 
      //bar.setProgress(mEqualizer.getBandLevel(band)+1500); 
      bar.setPadding(0, 10, 0, 10); 

      //bar.setProgressDrawable(R.drawable.scrubber_progress_horizontal_holo_light); 
      bar.setProgressDrawable(getResources().getDrawable(R.drawable.scrubber_progress_horizontal_holo_light)); 
      bar.setThumb(getResources().getDrawable(R.drawable.scrubber_control_selector_holo)); 
      //System.out.println("Progress:::"+(mEqualizer.getBandLevel(band))); 
      //bar[i].setProgress((maxEQLevel-minEQLevel)/2); 
      mEqualizer.setBandLevel(band,(short) ((maxEQLevel-minEQLevel))); 
      //System.out.println("Presets are: "+mEqualizer.getNumberOfPresets()+" And name is: "+mEqualizer.getPresetName(i)); 

      //mEqualizer.setBandLevel(band, level) 
      bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
       public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { 
        System.out.println("Seek bar change "); 
        presetsSpinner.setSelection(0); 
        mEqualizer.setBandLevel(band, (short) (progress + minEQLevel)); 

       } 

       public void onStartTrackingTouch(SeekBar seekBar) {} 
       public void onStopTrackingTouch(SeekBar seekBar) {} 
      }); 

      row.addView(maxDbTextView); 
      row.addView(bar); 
      row.addView(minDbTextView); 

      newOne.addView(row, params); 
     } 

     equalizerLayout.addView(newOne); 
    } 

Und die VerticalSeekBar ist die Klasse wie folgt:

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; 
    } 
} 

Hoffnung über Code helfen Ihnen. Wenn nicht, lass es mich wissen.

Genießen Coding ... :)

+0

Danke für die Antwort, ich habe Ihren Code verwendet. aber noe zeigt Indikator, Bitte überprüfen Sie meine Frage bearbeitet. –

+0

können Sie bitte bar.setRotation (270) entfernen; und sehe das Ergebnis. Ich habe so etwas in meinem Code nicht. –

+0

meine Frage ist über vertikale Suchleiste. wenn ich bar.setRotation (270) entferne; dann zeigt es horizontal. –

2

Offenbar Equalizer ist nicht Teil von Google Play Musik, sondern eine separate Anwendung namens MusicFX (com.android.musicfx):

I/ActivityManager(536): START u0 {act=android.media.action.DISPLAY_AUDIO_EFFECT_CONTROL_PANEL cmp=com.android.musicfx/.Compatibility$Redirector (has extras)} from pid 4800 
I/ActivityManager(536): START u0 {act=android.media.action.DISPLAY_AUDIO_EFFECT_CONTROL_PANEL flg=0x2000000 cmp=com.android.musicfx/.ActivityMusic (has extras)} from pid 4867 
I/ActivityManager(536): Displayed com.android.musicfx/.ActivityMusic: +293ms (total +315ms) 

Der Quellcode von MusicFX ist von Android repository zur Verfügung.

Hoffe, das hilft.

9

iDroid Explorer Code ist groß und hat mir geholfen, den Job zu erledigen viel Wert zu erhalten, aber es wird einige Teile fehlen. Hier ist meine gehackte Version, es funktioniert gut für mich und ich hoffe, es tut es auch für Sie.

public class VerticalSeekBar extends SeekBar { 

    protected OnSeekBarChangeListener changeListener; 
    protected int x, y, z, w; 

    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); 
    } 

    @Override 
    protected synchronized void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(h, w, oldh, oldw); 

     this.x = w; 
     this.y = h; 
     this.z = oldw; 
     this.w = oldh; 
    } 

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

    @Override 
    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: 
       setSelected(true); 
       setPressed(true); 
       if (changeListener != null) changeListener.onStartTrackingTouch(this); 
       break; 
      case MotionEvent.ACTION_UP: 
       setSelected(false); 
       setPressed(false); 
       if (changeListener != null) changeListener.onStopTrackingTouch(this); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       int progress = getMax() - (int) (getMax() * event.getY()/getHeight()); 
       setProgress(progress); 
       onSizeChanged(getWidth(), getHeight(), 0, 0); 
       if (changeListener != null) changeListener.onProgressChanged(this, progress, true); 
       break; 

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

    @Override 
    public synchronized void setOnSeekBarChangeListener(OnSeekBarChangeListener listener) { 
     changeListener = listener; 
    } 

    @Override 
    public synchronized void setProgress(int progress) { 
     if (progress >= 0) 
      super.setProgress(progress); 

     else 
      super.setProgress(0); 
     onSizeChanged(x, y, z, w); 
     if (changeListener != null) changeListener.onProgressChanged(this, progress, false); 
    } 
}