1

我需要创建进度条,所以我通过扩展 ProgressBar 在 onDraw 方法中完成了它,并且此代码在所有 android 设备中工作,除了 Galaxy nexus .. 虽然它没有抛出和异常,但进度可绘制并没有通过 asynctask 更新。此代码完全适用于除银河系外的所有设备

@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);

}

问题可能与可绘制和样式有关,但它适用于所有版本和所有设备

4

1 回答 1

0

我在此代码段中看不到您在问题中陈述的问题,但我可以在您的代码本身中看到很多问题。

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

还有一件事,创建一个新的 确实是个Paint主意,Typeface在每次调用 时onDraw,它都会破坏性能。将它们保存为实例变量并尽可能重用它们,即使是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>

看看这个关于定义形状的更多信息。

于 2012-11-22T05:42:13.783 回答