Справа налево ProgressBar? - PullRequest
       59

Справа налево ProgressBar?

20 голосов
/ 07 октября 2010

Кто-нибудь знает, как сделать View полностью измененным, у меня есть горизонтальная панель ProgressBar, и я хочу, чтобы она была справа налево, а не слева направо

Ответы [ 8 ]

61 голосов
/ 17 августа 2013

Это даже проще. Вы можете просто вызвать следующий метод, и он будет повернут и работает так, как вы хотели.

progressBar.setRotation(180);

Пример: a normal progressbar and a RTL progressbar

21 голосов
/ 03 ноября 2016

Вы можете перевернуть представление в формате xml, используя атрибуты scaleX или scaleY

    <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleX="-1"/>
16 голосов
/ 07 октября 2010

Создайте подкласс обычного представления индикатора выполнения и реализуйте метод onDraw, чтобы повернуть холст перед его рисованием:

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

Это должно помочь.

14 голосов
/ 07 октября 2010
 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

8 голосов
/ 02 июня 2013

Вам не нужно вращать все View.

Просто используйте один атрибут xml в вашем my_progress_drawable.xml:

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

Документация говорит нам, что gravity="right" делает это:

Поместите объект по правому краю его контейнера, не меняя его размера. Когда clipOrientation "горизонтальный", отсечение происходит с левой стороны отрисовки.

Не переопределять onDraw(). Эта реализация более стабильна в разных версиях Android.

К сожалению, невозможно установить гравитацию ClipDrawable программно, не вызывая его конструктор .

6 голосов
/ 30 марта 2018

если вы хотите его в 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"/>
3 голосов
/ 11 января 2017
<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" />
2 голосов
/ 01 сентября 2016

Потому что я ленивый. Я просто добавляю эти две строки в seekbar xml:

android:layoutDirection="rtl"
android:mirrorForRtl="true"

Есть ли минусы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...