【问题标题】:I realized a custom progress bar, but I want to improve that我实现了一个自定义进度条,但我想改进它
【发布时间】: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] 是背景图片

这是结果:

你能帮我改进我的实现吗?

问题列表:

  1. 我必须使用@pskink 建议优化代码。

  2. 我想添加一些动画师,因为我想要更多的流动性

  3. 内存消耗

  4. 垂直线在不同设备上显示不同。

        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


【解决方案1】:

请检查另一个drawBitmap canvas 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);
}

【讨论】:

  • 如果我使用drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint),位图是完整的进度条(是一个三角形矩形png),但如果我设置dst,图像将是拉伸?我想显示背景 png(空进度条)和完整 png 的一部分。
  • 如果可能,您可以指定Rect src(要绘制的位图的子集)。
  • 我更新了第一篇文章,我正在尝试使用“画布的另一种drawBitmap方法”
  • 为什么不根据Power计算Rect dst
  • 好的,继续。如果希望进度条从 20 开始,只需根据需要修改 Rect 即可。
猜你喜欢
  • 2018-08-05
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多