2013-08-23 18 views
9

Tôi muốn Vertical seekBar như hình ảnh bên dưới (dành cho android 4.O +)). của nó trong Google Play Music App.Thanh tìm kiếm dọc của Android như Google Play Music App

enter image description here

tôi đã cố gắng bên dưới cách: nhưng tôi không thể thiết lập Hight & rộng

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

tôi muốn như dưới đây:

enter image description here

ngay bây giờ tôi đã sử dụng số này Stack Answer nhưng nó quá khó để ma nage nhiều thanh tìm dọc.

tôi đang tìm cách tốt hơn.


EDIT:

tôi đã sử dụng dưới mã từ iDroid Explorer's answer cố gắng để hiển thị dọc tìm kiếm thanh:

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

     } 
    } 

nhưng có vẻ như dưới đây: chỉ số không hiển thị.

enter image description here

nếu tôi chỉ sử dụng một seekBar sau đó hình dáng của nó như dưới đây:

enter image description here

nó giống như sử dụng: android:rotation="270" trong file layout.

+0

tạo một lớp tùy chỉnh mà mở rộng seekbar, và sau đó tạo bao nhiêu seekbar ngành dọc bạn muốn –

+0

@Dhawal Sodha: bạn có thể vui lòng cho tôi biết là khó khăn mà bạn đang phải đối mặt trong quá trình thực hiện mã của tôi? hoặc mã của tôi làm việc cho bạn? –

+0

Sử dụng các sự kiện chạm gốc từ Android hoạt động khá tốt để tạo chế độ xem tùy chỉnh với tính năng kéo, sử dụng các khái niệm 'vị trí bắt đầu', 'delta' và 'vị trí kết thúc'. API Android rất rõ ràng và ổn định khi xử lý các sự kiện chạm, khiến cho logic bắt buộc trở nên không có trí tuệ. –

Trả lời

6

Bạn đã kiểm tra mã mẫu Android của AudioFXDemo? Nếu không thì vui lòng kiểm tra xem nó có hữu ích cho bạn hay không.

Có bộ chỉnh âm giống với ứng dụng Google Music.

Kiểm tra bên dưới mã trong đó Demo Ví dụ:

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

Và VerticalSeekBar là lớp như sau:

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

Hope trên mã giúp bạn. Nếu không thì hãy cho tôi biết.

Tận hưởng mã hóa ... :)

+0

Cảm ơn bạn đã trả lời, tôi đã sử dụng mã của bạn. nhưng là chỉ báo hiển thị, vui lòng kiểm tra câu hỏi đã chỉnh sửa của tôi. –

+0

bạn có thể vui lòng xóa bar.setRotation (270); và xem kết quả. Tôi không có bất cứ điều gì như thế trong mã của tôi. –

+0

câu hỏi của tôi là về thanh tìm kiếm dọc. nếu tôi loại bỏ bar.setRotation (270); sau đó nó hiển thị theo chiều ngang. –

2

Rõ ràng, cân bằng không phải là một phần của Google Play Music, mà đúng hơn là một ứng dụng riêng biệt được gọi là MusicFX (com.android.musicfx): Mã

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) 

Nguồn MusicFX có sẵn từ Android repository.

Hy vọng điều này sẽ hữu ích.

9

Mã của iDroid Explorer rất tuyệt và đã giúp tôi hoàn thành công việc, tuy nhiên thiếu một số phần. Đây là phiên bản bị tấn công của tôi, nó hoạt động rất tốt cho tôi và tôi hy vọng nó cũng có ích cho bạn.

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