Android - 如何将进度条设置为垂直显示而不是水平显示?

41

我正在尝试将 ProgressBar 作为类似计量的显示。我原以为这是一项容易的任务,并认为 ProgressBar 有一个可以设置为垂直的属性,但我没有看到任何东西。

此外,我希望能够在条形图的侧面显示标尺样式的指示器,以清晰地指示当前水平。

欢迎提供指引 - 谢谢!


http://android-coding.blogspot.co.uk/2013/02/implement-vertical-progressbar.html - M--
16个回答

1
为了使用ProgressBar并将其垂直显示,您需要创建一个自定义视图扩展ProgressBar视图并覆盖onDraw()方法。这将允许您以相反的方向进行绘制。查看ProgressBar.onDraw()的源代码(位于链接底部)以获取有关如何执行此操作的帮助。最好的情况是,您只需要交换一些x和y变量即可。

0
<ProgressBar
        android:id="@+id/battery_pb"
        android:rotation="270"
        android:progress="100"
...
/>

使用android:rotation="270"可以使其完全从底部到顶部,或者使用android:rotation="90"可以使其完全从顶部到底部。

1
无法工作,进度条旋转但高度仍然很小。 - htafoya
1
经过一些试验,我成功地让它工作了。在LinearLayout中,android:layout_width必须是“fill_parent”,而我必须稍微调整一下layout_weight,使其扩展到我想要的位置。但是,它确实有效。谢谢!这比编写自定义小部件简单得多。 - Mark Phillips

0

简单的进度条图片视图

示例

viewHolder.proBarTrueImage.setMaximalValue(147);
viewHolder.proBarTrueImage.setLevel(45);
viewHolder.proBarTrueImage.setColorResource(R.color.corner_blue);

简单的类
public class ProgressImageView extends ImageView {

private Context mContext;
private Paint paint;
private RectF rectf;

private int maximalValue = 1;
private int level = 0;
private int width;
private int height;

public ProgressImageView(Context context) {
    super(context);
    init(context, null, 0);
}

public ProgressImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs, 0);
}

public ProgressImageView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs, defStyleAttr);
}

private  void init(Context context, AttributeSet attrs, int defStyleAttr){

    mContext = context;
    paint = new Paint();
    rectf = new RectF();
    paint.setColor(Color.GRAY);
    paint.setStyle(Paint.Style.FILL);
};

@Override
protected void onDraw(Canvas canvas) {

    float dif = (float) height / (float) maximalValue;
    int newHeight = height - (int) (dif * level);

    rectf.set(0,newHeight, width, height);
    canvas.drawRect(rectf, paint);

    super.onDraw(canvas);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    this.width = w;
    this.height = h;
}

public void setMaximalValue(int maximalValue) {
    this.maximalValue = maximalValue;
    invalidate();
}

public void setLevel(int level) {
    this.level = level;
    invalidate();
}

public void setColorResource(int color) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        color = mContext.getResources().getColor(color,mContext.getTheme());
    }else {
        color = mContext.getResources().getColor(R.color.corner_blue);
    }

    setColor(color);
}

public void setColor(int color){
    if (paint != null){
        paint.setColor(color);
        invalidate();
    }
}

}


0

要创建一个垂直进度条,我解决的方法是先将其旋转90度,然后根据手动输入的值进行缩放。

scaleX = layout_height/layout_width

这是我在进度条上使用的属性示例:

android:layout_width="20dp"
android:layout_height="233dp"
android:rotation="-90"
android:scaleX="11.65"

这可能有点繁琐,但因为默认情况下它们没有垂直进度条,所以这对我来说是一个相当不错的解决方法。scaleX可以自动计算,但必须在屏幕上绘制所有内容之后才能进行。


0

在此输入链接描述

**看看这个链接,我试图使用类似的东西,你也可以使用步进器来满足你的需求,在Github上有一些关于如何在Android Studio中使用步进器的项目可供参考**


2
欢迎来到Stack Overflow!虽然链接是分享知识的好方法,但如果它们在未来失效了,它们就不会真正回答问题。在您的答案中添加回答问题的链接的基本内容。如果内容太复杂或太大而无法适应此处,请描述所提出解决方案的一般思路。请记住始终保留对原始解决方案网站的链接引用。请参见:如何撰写良好的答案? - sɐunıɔןɐqɐp

-18

默认情况下不支持垂直进度条。


42
你是谷歌的Android开发者,能否请你让所有进度条都支持垂直放置?我认为这是UI开发者很明显的期望。 - java.is.for.desktop
6
这不是问题的答案。它只是表示“太难了”。 - baash05
我认为你在Android方面不够好,无法提供解决方案。实际上这并不是一个答案,只是你的观点。 - Vladyslav Matviienko
1
看我的答案,这似乎很容易实现。 - guy_m
我通过这个被接受的答案了解到谷歌有哪些类型的开发人员! - user14016776

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接