从右到左ProgressBar?

时间:2010-10-07 00:11:10

标签: android view progress-bar

有没有人知道如何使视图反转,我有一个水平的ProgressBar,我希望它从右到左而不是从左到右

8 个答案:

答案 0 :(得分:59)

这更容易。您可以简单地调用以下方法,然后旋转它并按照您想要的方式工作。

progressBar.setRotation(180);

一个例子: a normal progressbar and a RTL progressbar

答案 1 :(得分:18)

您可以使用scaleX或scaleY属性

在xml中翻转视图
    <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleX="-1"/>

答案 2 :(得分:16)

创建常规进度条视图的子类并实现onDraw方法以在绘制之前旋转画布:

@Override
protected void onDraw(Canvas canvas) {
    canvas.save();
    canvas.rotate(180,<CenterX>,<CenterY>);
    super.onDraw(canvas);
    canvas.restore();
}

这应该可以解决问题。

答案 3 :(得分:14)

 public class inverseSeekBar extends ProgressBar {

public inverseSeekBar(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // TODO Auto-generated constructor stub
}

public inverseSeekBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

public inverseSeekBar(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

@Override
protected synchronized void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
     canvas.save(); 

        //now we change the matrix
        //We need to rotate around the center of our text
        //Otherwise it rotates around the origin, and that's bad. 
        float py = this.getHeight()/2.0f;
        float px = this.getWidth()/2.0f;
        canvas.rotate(180, px, py); 

        //draw the text with the matrix applied. 
        super.onDraw(canvas); 

        //restore the old matrix. 
        canvas.restore(); 
}}
  <com.hlidskialf.android.widget.inverseSeekBar 

       style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="200dip"
    android:layout_height="wrap_content"
    android:max="100"
    android:progress="50"
    android:secondaryProgress="75" 

/> 

mypackage:com.test.testProgressBar

答案 4 :(得分:8)

您无需旋转整个View

只需在my_progress_drawable.xml中使用a single xml attribute

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@android:id/background"
        android:drawable="@drawable/my_background"/>
    <item android:id="@android:id/progress">
        <clip
            android:drawable="@drawable/my_right_to_left_progress"
            android:gravity="right" /> <!-- Clip the image from the RIGHT -->
    </item>

</layer-list>

The documentation告诉我们gravity="right"执行此操作:

  

将对象放在容器的右边缘,而不是更改其大小。当clipOrientation为“水平”时,剪裁发生在drawable的左侧。

不要覆盖onDraw()。这种实现在不同版本的Android中更加稳定。

不幸的是,在不调用constructor的情况下,无法以编程方式设置ClipDrawable的严重性。

答案 5 :(得分:6)

如果你想在XML中使用它,你可以使用两个属性。 如果你想使用android:layoutDirection="rtl",它需要最低限度的API 17,但是如果你使用android:rotation="180"则没有API限制

<ProgressBar
        android:progress="20"
        android:rotation="180"
        style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

答案 6 :(得分:2)

我是懒惰我只是将这两行添加到<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> xml:

seekbar

这有什么缺点吗?

答案 7 :(得分:2)

<ProgressBar
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:max="100"
    android:layout_margin="8dp"
    android:layoutDirection="rtl"
    android:progress="80" />