如何以编程方式创建或更改由不同颜色的线条组成的可绘制对象

斯特凡

我必须画一条3dp线来表示测验游戏中的关卡完成情况。

这条线必须是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" />

...但是现在,我当然必须能够根据actuel用户的完成情况来更改此40%/ 60%的比例。

第一个问题:最好的最有效的方法是什么?在运行时更改可绘制对象?还是在Java运行时创建一个新的drawable?

第二个问题:该怎么做?我尝试了两种方式(在Java代码中重新创建此drawable /在运行时更改xml drawable),但未成功:-(

任何帮助将不胜感激。

pskink

所以这是您可以使用的自定义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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何以编程方式创建图层列表可绘制对象?

ImageView,如何以编程方式获取可绘制对象的getSrc?

以编程方式更改可绘制颜色

如何以编程方式更改形状颜色?

如何以编程方式绘制特定的可绘制资源?

如何以编程方式在 ImageView 中显示多个可绘制对象(带边距)

如何以特定方式以编程方式居中对齐绘制的对象

如何以编程方式设置编辑文本的可绘制背景

如何以编程方式隐藏可绘制权限

如何以编程方式修改可绘制角 Android Java

如何以编程方式制作可绘制形状(Android)

如何以编程方式更改Android Toggle / LabeledSwitch边框颜色?

如何以编程方式更改首选项文本颜色?

如何以编程方式在圆圈上动态更改颜色

如何以编程方式更改单选按钮的选中颜色

如何以编程方式更改Tkinter标签的颜色?

如何以编程方式更改背景形状的颜色

如何以编程方式更改主题颜色:样式,属性android?

如何以编程方式更改Kendo UI Scheduler事件颜色

如何以编程方式更改 GroupBox Header 字体颜色?

以编程方式更改可绘制对象的拐角半径

如何以编程方式创建传单图标类的对象列表?

以编程方式更改可绘制按钮

以编程方式创建可绘制进度

如何以编程方式将textView的颜色更改为保存在属性文件中的颜色?

如何更改子图中不同线条的线条颜色

如何使用 Kotlin 或 Java 更改可绘制对象的笔触颜色

在没有findViewById()的情况下以编程方式更改可绘制xml文件的颜色

如何以编程方式更改XML值