2013-08-23 7 views
9

मैं वर्टिकल तलाशबार को नीचे छवि (एंड्रॉइड 4. ओ + के लिए) की तरह चाहता हूं)। इसकी Google Play Music ऐप में।एंड्रॉइड वर्टिकल सीक बार जैसे Google Play म्यूजिक ऐप

enter image description here

मैं जिस तरह से नीचे की कोशिश की है: लेकिन मैं hight & चौड़ाई निर्धारित नहीं कर सकते

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

मैं नीचे की तरह हैं:

enter image description here

अभी मैं इस Stack Answer का उपयोग किया है, लेकिन यह बहुत मुश्किल है नज एकाधिक लंबवत खोजबार।

मैं इससे बेहतर तरीके से ढूंढ रहा हूं।


संपादित करें:

मैं iDroid Explorer's answer से नीचे दिए गए कोड का इस्तेमाल किया है सीक बार खड़ी प्रदर्शित करने के लिए प्रयास करें:

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

     } 
    } 

लेकिन यह नीचे दिखाई देता है: सूचक नहीं दिखा रहा है।

enter image description here

अगर मैं नीचे की तरह अपनी नज़र तो केवल एक ही seekbar का उपयोग करें:

enter image description here

यह

ही उपयोग की तरह: android:rotation="270" लेआउट फ़ाइल में।

+0

जो seekbar फैली एक कस्टम वर्ग बनाते हैं और फिर आप चाहते हैं –

+0

@Dhawal सोढा के रूप में कई ऊर्ध्वाधर seekbar बनाने के लिए: क्या आप मुझे बता सकते हैं जो कठिनाई तुम मेरे कोड को लागू करने के दौरान सामना कर रहे हैं? या मेरा कोड आपके लिए काम करता है? –

+0

एंड्रॉइड से देशी टच इवेंट्स का उपयोग करके 'स्टार्ट पोजीशन', 'डेल्टा' और 'एंड पोजीशन' अवधारणाओं का उपयोग करके ड्रैगिंग फीचर के साथ कस्टम व्यू बनाने के लिए बहुत अच्छी तरह से काम करना है। एंड्रॉइड एपीआई स्पर्श घटनाओं को संभालने के दौरान बहुत स्पष्ट और स्थिर है, आवश्यक तर्क को कोई ब्रेनर नहीं बना रहा है। –

उत्तर

6

क्या आपने AudioFXDemo के एंड्रॉइड नमूना कोड की जांच की है? यदि नहीं तो कृपया इसे जांचें और देखें कि यह आपके लिए सहायक है या नहीं।

इक्वाइज़र है जो Google Music ऐप के समान है। कि डेमो उदाहरण में कोड नीचे

की जांच:

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

आशा कोड यदि आपको मदद से ऊपर:

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

और VerticalSeekBar वर्ग के रूप में नीचे है। यदि नहीं तो मुझे बताएं।

कोडिंग का आनंद लें ... :)

+0

उत्तर के लिए धन्यवाद, मैंने आपके कोड का उपयोग किया है। लेकिन कोई संकेतक नहीं दिखा रहा है, कृपया मेरे संपादित प्रश्न की जांच करें। –

+0

क्या आप बार.सेट रोटेशन (270) को हटा सकते हैं; और परिणाम देखें। मेरे पास मेरे कोड में ऐसा कुछ नहीं है। –

+0

मेरा प्रश्न लंबवत खोज बार के बारे में है। अगर मैं bar.setRotation (270) हटा देता हूं; तो यह क्षैतिज दिखाता है। –

2

जाहिर है, तुल्यकारक Google Play संगीत का हिस्सा नहीं है, बल्कि एक अलग आवेदन MusicFX (com.android.musicfx) कहा जाता है: 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) 

स्रोत कोड Android repository से उपलब्ध है।

उम्मीद है कि इससे मदद मिलती है।

9

iDroid एक्सप्लोरर के कोड महान है और मुझे बहुत अच्छा काम किया हो रही मदद की, लेकिन यह कुछ भागों याद आ रही है। यहां मेरा हैक किया गया संस्करण है, यह मेरे लिए बहुत अच्छा काम करता है और मुझे आशा है कि यह आपके लिए भी होगा।

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); 
    } 
} 
संबंधित मुद्दे