我意识到自定义进度条,但我希望改进它

时间:2015-09-26 16:34:22

标签: android android-view android-progressbar

我实现了一个自定义进度条,为此我扩展了一个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);

}

,其中

  • pbIndex就是力量
  • pb_i [0]是背景图片

这是结果: enter image description here

你能帮助我改进我的实施吗?

问题列表:

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

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

  3. 公羊消费

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

        paintLine = new Paint();
        paintLine.setColor(Color.parseColor("#FD8F40"));
        paintLine.setAntiAlias(true);
        paintLine.setStrokeWidth(7);
    
  5. 特别是笔画宽度看起来不同

    第二次实施: 在我的布局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方法中插入一些动画师

1 个答案:

答案 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);
}