Право на левый прогрессБар?
Кто-нибудь знает, как сделать View reverse, у меня есть горизонтальный ProgressBar, и я хочу, чтобы он был справа налево, а не слева направо.
Ответы
Ответ 1
Создайте подкласс нормального индикатора выполнения и реализуйте метод onDraw для поворота холста перед его рисованием:
@Override
protected void onDraw(Canvas canvas) {
canvas.save();
canvas.rotate(180,<CenterX>,<CenterY>);
super.onDraw(canvas);
canvas.restore();
}
Это должно сделать трюк.
Ответ 2
Это еще проще. Вы можете просто вызвать следующий метод, а затем он повернут и работает так, как вы хотели.
progressBar.setRotation(180);
Пример:
![a normal progressbar and a RTL progressbar]()
Ответ 3
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 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
Вам не нужно вращать весь 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
программно, не ссылаясь на конструктор .
Ответ 5
Вы можете перевернуть представление в xml с помощью атрибутов scaleX или scaleY
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleX="-1"/>
Ответ 6
Потому что я ленив, я просто добавляю эти две строки в seekbar
xml:
android:layoutDirection="rtl"
android:mirrorForRtl="true"
Любые недостатки этого?
Ответ 7
<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" />