我需要创建进度条,所以我通过扩展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,但它适用于所有版本和所有设备
答案 0 :(得分:0)
我无法在此代码段中看到您在问题中说明的问题,但我可以在您的代码中看到很多问题。
我猜你是View
的子类,我不知道为什么你synchronized
onDraw
方法,没有必要这样做。通过制作onDraw
方法synchronized
,您只需阻止所有其他线程在onDraw
执行时访问您的对象,并注意onDraw
可能会被频繁调用,如果您真的需要同步,如果这样做就足够了,建立一个小 synchronized
块。
还有一件事,在每次调用Paint
时创建一个新的Typeface
,onDraw
确实非常 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。