1

2色のプログレスバーが欲しいです。そして、いつか私は赤い色の進行を増やしたい、そしてある時は緑の色で増やしたい。簡単に言えば、プログレスバーを2つに分割したいと思います。1つの緑のセクションと他の赤で進行状況を赤でインクリメントしたい場合は、赤でインクリメントし、緑の場合と同じです。進行は左から始まることに注意してください。どうすればこれを達成できますか。二次進捗を使用する必要があることはわかっていますが、どのようにしたらよいですか?これが私のコードと私がやろうとしていることです。

final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
    ShapeDrawable pgDrawable = new ShapeDrawable(new RoundRectShape(
            roundedCorners, null, null));

    if (answer == true) {

        pgDrawable.getPaint().setColor(Color.parseColor(greenColor));
        Log.i("green", ": should work");

    } else if (answer == false) {

        pgDrawable.getPaint().setColor(Color.parseColor(redColor));
        Log.i("red", ": should work");
    }

    ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT,
            ClipDrawable.HORIZONTAL);
    progressBarTotal.setProgressDrawable(progress);

    progressBarTotal.setBackgroundDrawable(getResources().getDrawable(
            android.R.drawable.progress_horizontal));

    if (TotalPercent >= 102) {

        Toast.makeText(ProcessGame.this, "Full", Toast.LENGTH_LONG).show();
    } else {
        progressBarTotal.setProgress(TotalPercent);

        TotalPercent = (TotalPercent + 1);

    }

これがJavaで実行できるのであれば、xmlのものをいじりたくありません。

4

1 に答える 1

0

独自のビューを作成できます。

public class CustomProgressBar extends View{
    public CustomProgressBar(Context context, AttributeSet attribs){
        super(context, attribs);
        float xRadius = 5f, yRadius =  = 5f;

        Paint emptyPaint = new Paint();
        emptyPaint.setColor(Color.WHITE);


        Paint greenPaint = new Paint();
        greenPaint.setColor(Color.GREEN);

        Paint redPaint = new Paint();
        redPaint.setColor(Color.RED);

        Rectf emptyBar = new Rectf(0,0,0,0);
        Rectf greenBar = new Rectf(0,0,0,0);
        Rectf redBar = new Rectf(0,0,0,0);
    }

    public void setProgress(float greenProgress, float redProgress){
        //progress should be between 0f and 1f
        //but you can change it, just change how the width is calculated
        emptyBar.set(0,0,getWidth(), getHeight());
        greenBar.set(0,0,getWidth() * greenProgress, getHeight());
        redBar.set(0,0,getWidth() * redProgress, getHeight());
        //force the view to draw again
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas){
        canvas.drawRoundRect(emptyBar, xRadius,yRadius, emptyPaint);
        canvas.drawRoundRect(greenBar, xRadius,yRadius, greenPaint);
        canvas.drawRoundRect(redBar, xRadius,yRadius, redPaint);
    }
}

xml では、ビューは次のようになります

<com.mydomain.widgets.CustomProgressBar 
    android:layout_width="fill_parent"
    android:layout_height="10dip"
/>

コードは、それを実行する方法の単なる例です。ビューの幅と高さの値をローカル変数に保存して常に呼び出すことを避けることgetWidthgetHeightできますが、アクティビティのonWindowFocusChangedコールバック内などの特定の場所でのみこれを行うことができます。それ以外の場合は getWidth と getHeight 0 を返します。空のバーは、毎回設定することを避けるために、一度適切な値で初期化することもできます。

于 2012-09-07T13:40:57.780 に答える