ビューを反転させる方法を知っている人はいますか?水平のプログレスバーがあり、左から右ではなく右から左にしたいです
通常のプログレスバービューのサブクラスを作成し、onDrawメソッドを実装して、キャンバスを描画する前に回転させます。
@Override
protected void onDraw(Canvas canvas) {
canvas.save();
canvas.rotate(180,<CenterX>,<CenterY>);
super.onDraw(canvas);
canvas.restore();
}
これでうまくいくはずです。
それはさらに簡単です。次のメソッドを呼び出すだけで、回転して希望どおりに機能します。
progressBar.setRotation(180);
例:
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
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が「horizontal」の場合、ドローアブルの左側でクリッピングが発生します。
onDraw()
をオーバーライドしないでください。この実装は、Androidのさまざまなバージョン間でより安定しています。
残念ながら、 コンストラクター を呼び出さずにプログラムでClipDrawable
の重力を設定することは不可能です。
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"/>
<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" />
Cos私は怠惰です私はこれらの2行をseekbar
xmlに追加するだけです:
Android:layoutDirection="rtl"
Android:mirrorForRtl="true"
これの欠点はありますか?