Android的垂直寻求像谷歌Play音乐应用吧音乐、Android、像谷歌、Play

2023-09-12 10:01:53 作者:一个人挺好

我要垂直搜索栏像下面的图像的(对于Android 4.O +))。它在谷歌播放音乐的应用程序。

I want Vertical seekBar like below image (for android 4.O+)). its in Google Play Music App.

我曾尝试以下方式:,但我不能设置HIGHT和放大器;宽度

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

我要象下面这样:

i want like below:

现在,我已经使用这个堆栈答案但它太硬,管理多个垂直搜索栏。

right now i have used this Stack Answer but its too hard to manage multiple vertical seekbar.

我期待比这更好的办法。

i am looking for better way than this.

编辑:

我用下面code从 idroid的资源管理器的回答尝试显示垂直搜索栏:

i have used below code from iDroid Explorer's answer try to display vertical seek bar:

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

        }
    }

但它看起来像如下:指标没有显示

如果我只使用一个搜索栏,然后它的样子如下:

它同样喜欢使用:机器人:旋转=270在布局文件

it same like use : android:rotation="270" in layout file.

推荐答案

你有没有检查AudioFXDemo?如果没有,那么请检查一下,看看是否对你有帮助或没有。

Have you check the android Sample code of AudioFXDemo? If not then please check it and see whether it is helpful to you or not.

有均衡器是一样的谷歌音乐应用都有。

There is Equalizer which is same as Google Music app have.

检查低于code在演示示例:

Check below code in that Demo Example:

    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是类如下:

And the VerticalSeekBar is the class as below:

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

希望以上code帮你。如果没有,那么让我知道。

Hope above code help you. If not then let me know.

享受编码...:)