自定义进度条不适用于Galaxy Nexus设备

时间:2012-11-19 10:50:22

标签: android progress-bar custom-component

我需要创建进度条,所以我通过扩展ProgressBar在onDraw方法中完成它,这个代码在除galaxy nexus之外的所有android设备中都有效..虽然它没有抛出和异常但是进度可绘制不是通过平均值更新asynctask。此代码完全适用于除galaxy nexus之外的所有设备

@Override
protected synchronized void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint textPaint = new Paint();
    textPaint.setAntiAlias(true);
    textPaint.setColor(textColor);

    Typeface tmTypeface = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
    textPaint.setTypeface(tmTypeface);
    textPaint.setTextSize(textSize * mContext.getResources().getDisplayMetrics().density);
    Rect bounds = new Rect();
    textPaint.getTextBounds(text, 0, text.length(), bounds);
    int x = getWidth() / 2 - bounds.centerX();
    int y = getHeight() / 2 - bounds.centerY();
    canvas.drawBitmap(thumbnailBitmap, 10, y - bitmapHeight / 2, null);
    canvas.drawText(text, 15 + thumbnailBitmap.getWidth(), y, textPaint);
    canvas.drawBitmap(downloadBitmap, getWidth() - bitmapWidth, y - bitmapHeight / 2, null);

}

问题可能在于drawable和style,但它适用于所有版本和所有设备

1 个答案:

答案 0 :(得分:0)

我无法在此代码段中看到您在问题中说明的问题,但我可以在您的代码中看到很多问题。

我猜你是View的子类,我不知道为什么你synchronized onDraw方法,没有必要这样做。通过制作onDraw方法synchronized,您只需阻止所有其他线程在onDraw执行时访问您的对象,并注意onDraw可能会被频繁调用,如果您真的需要同步,如果这样做就足够了,建立一个 synchronized块。

还有一件事,在每次调用Paint时创建一个新的TypefaceonDraw确实非常 BAD ,这会让人失望。将它们保存为实例变量并尽可能重用它们,甚至可以重用Rect对象。

让我们回到您的问题,如果您想创建自定义进度条,您只需在布局定义中创建一个进度条样式和引用(以XML格式)。在my_progressbar.xml目录下创建drawable并将以下内容保存在文件中,在ProgressBar定义中引用此样式,例如<ProgressBar ... android:progressDrawable="@drawable/my_progressbar"/>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@android:id/background">
    <shape android:shape="rectangle" >
        <solid android:color="#ffcccccc" />
    </shape>
</item>

<item android:id="@android:id/secondaryProgress">
    <clip>
    <shape android:shape="rectangle" >
        <solid android:color="#ff000000" />
    </shape>
    </clip>
</item>

<item android:id="@android:id/progress">
    <clip>
    <shape android:shape="rectangle" >
        <solid android:color="#ffff6100" />
    </shape>
    </clip>
</item>

有关定义形状的更多信息,请查看this