我实现了一个自定义进度条,为此我扩展了一个View。该进度条填充在从线程接收的某个值的基础上,而且该视图还包含改变与按压按钮相关的位置的垂直线,该计数器指示垂直线的位置。进度条的形状是一个三角形矩形。
在我的extendev视图中,我实现了这个方法:
public void setPowerBar(int Power)
{
pbIndex = 0;
invalidate();
requestLayout();
}
这是ondraw:
@Override
public void onDraw(Canvas canvas)
{
super.onDraw(canvas);
canvas.drawColor(Color.TRANSPARENT);
int width = ((pbIndex-20) * pb_i[0].getScaledWidth(canvas.getDensity())) / 180;
int height = pb_i[0].getScaledHeight(canvas.getDensity())-(((pbIndex-20) * pb_i[0].getScaledHeight(canvas.getDensity())) / 180);
dst.set(0, height, width, pb_i[0].getScaledHeight(canvas));
canvas.drawBitmap(pb_i[0], 0, 0, null);
canvas.drawBitmap(pb_i[1],null,dst,null);
float dim = (pb_i[0].getScaledWidth(canvas.getDensity()));
float step = dim/180;
float xPos = ((orangePower-20)*step);
canvas.drawLine(xPos, 0, xPos, pb_i[0].getScaledHeight(canvas), paintLine);
canvas.drawText("" + orangePower, (dim / 2), pb_i[0].getScaledHeight(canvas), textPaint);
}
,其中
你能帮助我改进我的实施吗?
问题列表:
我必须使用@pskink建议来优化代码。
我想添加一些动画师,因为我想要很多流动性
公羊消费
不同设备上的垂直线显示不同。
paintLine = new Paint();
paintLine.setColor(Color.parseColor("#FD8F40"));
paintLine.setAntiAlias(true);
paintLine.setStrokeWidth(7);
特别是笔画宽度看起来不同
第二次实施: 在我的布局xml中我插入:
<com.example.canvastest.PowerBar
android:id="@+id/power_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="200"
android:progress="0"
style="?android:attr/progressBarStyleHorizontal"
android:maxHeight="12dip"
android:minHeight="12dip"
/>
然后我添加这个drawable:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@android:id/background">
<clip>
<bitmap android:src="@drawable/pb_0" />
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<bitmap android:src="@drawable/pb_100" />
</clip>
</item>
</layer-list>
然后我扩展了progressbar及其ondraw方法:
@Override
public synchronized void onDraw(Canvas canvas)
{
super.onDraw(canvas);
float dim = (canvas.getWidth());
float step = dim/180;
float xPos = ((orangePower-20)*step);
canvas.drawLine(xPos, 0, xPos, canvas.getHeight(), paintLine);
canvas.drawText("" + orangePower, (dim / 2),canvas.getHeight(), textPaint);
}
但我有两个问题:
1-当进度为20时,进度条必须为空 2-背景是白色而不是@ drawable / pb_0 3-我必须在ondraw方法中插入一些动画师
答案 0 :(得分:1)
请检查另一个drawBitmap
方法画布here。
例如:
@Override
public void onDraw(Canvas canvas)
{
super.onDraw(canvas);
canvas.drawColor(Color.TRANSPARENT);
// VIEW_WIDTH & VIEW_HEIGHT is the size of your progress bar, MAX_POWER is the max value of the Power
int width = (Power * VIEW_WIDTH) / MAX_POWER;
Rect dst = new Rect(0, 0, width, VIEW_HEIGHT);
// only need one bitmap
canvas.drawBitmap(pb_i[10], null, 0, null);
}