【发布时间】:2015-12-24 07:15:17
【问题描述】:
我实现了一个自定义进度条,为此我扩展了一个视图。这个进度条填充了从线程接收到的一些值的基础,此外,这个视图还包含一条垂直线,它改变与按下按钮相关的位置,一个指示垂直线位置的计数器。进度条的形状是三角形矩形。
在我的扩展视图中,我实现了这个方法:
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);
}
在哪里
- pbIndex 是幂
- pb_i[0] 是背景图片
你能帮我改进我的实现吗?
问题列表:
我必须使用@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>
然后我扩展进度条及其 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 方法中插入一些动画师
【问题讨论】:
-
为什么不使用普通的
ProgressBar视图? -
所以不需要自定义 View,使用自定义进度 Drawable (
ProgressBar#setProgressDrawable) -
不,您应该将
ProgressBar#setProgressDrawable与您的自定义Drawable一起使用:A Drawable is a general abstraction for "something that can be drawn."示例实现here -
你看到我发布的链接了吗?
-
当您需要一些自定义操作时,而不是用于绘制进度条(或绘制无法由 Drawable 绘制的任何内容)
标签: android android-view android-progressbar