web-dev-qa-db-ja.com

右から左へのプログレスバー?

ビューを反転させる方法を知っている人はいますか?水平のプログレスバーがあり、左から右ではなく右から左にしたいです

22
Niko

通常のプログレスバービューのサブクラスを作成し、onDrawメソッドを実装して、キャンバスを描画する前に回転させます。

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

これでうまくいくはずです。

17
Moss

それはさらに簡単です。次のメソッドを呼び出すだけで、回転して希望どおりに機能します。

progressBar.setRotation(180);

例: a normal progressbar and a RTL progressbar

64
yansigner

ScaleXまたはscaleY属性を使用してxmlでビューを反転できます

    <ProgressBar
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:scaleX="-1"/>
 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

14
pengwang

View全体を回転させる必要はありません。

_my_progress_drawable.xml_で 単一の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が「horizo​​ntal」の場合、ドローアブルの左側でクリッピングが発生します。

onDraw()をオーバーライドしないでください。この実装は、Androidのさまざまなバージョン間でより安定しています。

残念ながら、 コンストラクター を呼び出さずにプログラムでClipDrawableの重力を設定することは不可能です。

9

xMLで必要な場合は、使用できる2つのプロパティがあります。 Android:layoutDirection="rtl"を使用する場合は最小のAPI17が必要ですが、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"/>
8
Umair Khalid
<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" />
3
Krishna

Cos私は怠惰です私はこれらの2行をseekbarxmlに追加するだけです:

Android:layoutDirection="rtl"
Android:mirrorForRtl="true"

これの欠点はありますか?

3
mmmartinnn