7

クイズ ゲームでレベルの完了を表すには、3 dp の線を引く必要があります。

この線は 2 色でなければなりません。たとえば、ユーザーがレベルの 40% を完了した場合、線は線の最初の 40% で赤になり、残りの 60% は灰色になります。

私は drawable でそれを行うことができました:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="line" >
            <size android:height="3dp" android:width="40dp"/>
            <stroke
                android:width="1dp"
                android:color="#FFFC10" />
        </shape>
    </item>
    <item android:left="40dp">
        <shape android:shape="line" >
            <size android:height="3dp" android:width="60dp" />
            <stroke
                android:width="1dp"
                android:color="#DDDDDD" />
        </shape>
    </item>
</layer-list>

そして、それを ImageView で表示します:

<ImageView
                android:id="@+id/row_completion_bar"
                android:src="@drawable/completion_bar"
                android:layout_width="100dp"
                android:layout_height="3dp" />

...しかし、もちろん、実際のユーザーの完了に応じて、この 40%/60% の比率を変更できる必要があります。

最初の質問: それを行う最も効率的な方法は何ですか? 実行時にドローアブルを変更しますか? またはJavaで実行時に新しいドローアブルを作成しますか?

2 番目の質問: どうすればいいですか? 私は両方の方法を試しました(Javaコードでこのドローアブルを再作成する/実行時にxmlドローアブルを変更します)が成功しませんでした:-(

どんな助けでも大歓迎です。

4

4 に答える 4

15

これは、使用できるカスタム Drawable です。

class LineDrawable extends Drawable {
    private Paint mPaint;

    public LineDrawable() {
        mPaint = new Paint();
        mPaint.setStrokeWidth(3);
    }

    @Override
    public void draw(Canvas canvas) {
        int lvl = getLevel();
        Rect b = getBounds();
        float x = b.width() * lvl / 10000.0f;
        float y = (b.height() - mPaint.getStrokeWidth()) / 2;
        mPaint.setColor(0xffff0000);
        canvas.drawLine(0, y, x, y, mPaint);
        mPaint.setColor(0xff00ff00);
        canvas.drawLine(x, y, b.width(), y, mPaint);
    }

    @Override
    protected boolean onLevelChange(int level) {
        invalidateSelf();
        return true;
    }

    @Override
    public void setAlpha(int alpha) {
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}

そしてテストコード:

View v = new View(this);
final LineDrawable d = new LineDrawable();
d.setLevel(4000);
v.setBackgroundDrawable(d);
setContentView(v);
OnTouchListener l = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int lvl = (int) (10000 * event.getX() / v.getWidth());
        d.setLevel(lvl);
        return true;
    }
};
v.setOnTouchListener(l);
于 2013-07-30T16:53:46.873 に答える
0

このスニペットはすべての API で機能します

これを使って:

Drawable drawable = editText.getBackground();
drawable.setColorFilter(editTextColor, PorterDuff.Mode.SRC_ATOP);
if(Build.VERSION.SDK_INT > 16) {
    editText.setBackground(drawable);
}else{
    editText.setBackgroundDrawable(drawable);
}
于 2016-09-14T07:47:05.223 に答える