Android - set a ProgressBar to be a vertical bar instead of horizontal?

后端 未结 14 616
不知归路
不知归路 2020-11-30 22:22

I am trying to use a ProgressBar as a metering like display. I thought it was going to be an easy task and thought that ProgressBar had a property to set to be vertical, bu

相关标签:
14条回答
  • 2020-11-30 23:11

    To utilize the ProgressBar and make it vertical, you would have to create your own custom View extending the ProgressBar view and override the onDraw() method. This will allow you to draw it in a reverse orientation. Take a look at the source code of the ProgressBar.onDraw() (located at the bottom of the link) for help on how to do this. Best case scenario, you'll just have to swap a few x and y variables.

    0 讨论(0)
  • 2020-11-30 23:13

    You have to create your own custom progressbar.

    In your xml add this layout:

     <com.example.component.VerticalProgressBar 
            style="?android:attr/progressBarStyleHorizontal"
            android:id="@+id/verticalRatingBar1"
            android:layout_width="wrap_content"
            android:progress="50"
            android:layout_height="fill_parent" />
    

    VerticalProgressBar.java

    public class VerticalProgressBar extends ProgressBar{
        private int x, y, z, w;
    
        @Override
        protected void drawableStateChanged() {
            // TODO Auto-generated method stub
            super.drawableStateChanged();
        }
    
        public VerticalProgressBar(Context context) {
            super(context);
        }
    
        public VerticalProgressBar(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        public VerticalProgressBar(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        protected 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 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:
    
                setSelected(true);
                setPressed(true);
                break;
            case MotionEvent.ACTION_MOVE:
                setProgress(getMax()
                        - (int) (getMax() * event.getY() / getHeight()));
                onSizeChanged(getWidth(), getHeight(), 0, 0);
    
                break;
            case MotionEvent.ACTION_UP:
                setSelected(false);
                setPressed(false);
                break;
    
            case MotionEvent.ACTION_CANCEL:
                break;
            }
            return true;
        }
    
        @Override
        public synchronized void setProgress(int progress) {
    
            if (progress >= 0)
                super.setProgress(progress);
    
            else
                super.setProgress(0);
            onSizeChanged(x, y, z, w);
    
        }
    }
    

    Or : Jagsaund solution is also being perfect.

    0 讨论(0)
  • 2020-11-30 23:13

    Add this to the xml code android:rotation="90" android:transformPivotX="0dp" So this is how your Progress Bar xml should look

    <ProgressBar
        android:id="@+id/progressBar6"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:rotation="90"
        android:transformPivotX="0dp"
        tools:layout_editor_absoluteX="101dp"
        tools:layout_editor_absoluteY="187dp" />
    
    0 讨论(0)
  • 2020-11-30 23:15

    Vertical progress bars are not supported by default.

    0 讨论(0)
  • 2020-11-30 23:15

    I know that it´s an old post but I found a very simple solution to this problem that maybe can help somebody. First at all create a progress_drawable_vertical.xml like this:

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <color android:color="#777" />
    </item>
    <item android:id="@android:id/progress">
        <clip
            android:clipOrientation="vertical"
            android:gravity="bottom">
            <shape>
                <gradient
                    android:startColor="#00FF00"
                    android:centerColor="#FFFF00"
                    android:endColor="#FF0000"
                    android:angle="90" />
            </shape>
        </clip>
    </item>
    </layer-list>
    

    Then just use this in your progressBar:

    <ProgressBar
        android:id="@+id/progress_bar"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:max="100"
        android:progress="33"
        android:progressDrawable="@drawable/progress_drawable_vertical" />
    

    I also have created an progress_drawable_horizontal.xml

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <color android:color="#777" />
    </item>
    <item android:id="@android:id/progress">
        <clip
            android:clipOrientation="horizontal"
            android:gravity="left">
            <shape>
                <gradient
                    android:startColor="#00FF00"
                    android:centerColor="#FFFF00"
                    android:endColor="#FF0000" />
            </shape>
        </clip>
    </item>
    </layer-list>
    

    with the objetive of mantain the same style defined in progress_drawable_vertical.xml

    The key here is the correct use of android:clipOrientation and android:gravity.

    I found this solution here and the core of the solution is similar to jagsaund but a little bit more simple.

    0 讨论(0)
  • 2020-11-30 23:19

    enter link description here

    **Check this link out, I was trying to use a similar thing and also you can use stepper for your requirement, few projects are available on Github about HOW TO USE STEPPER IN ANDROID STUDIO **

    0 讨论(0)
提交回复
热议问题