2

在我的Android應用我有幾個小部件,我希望他們看起來像這些進度條。Android小工具弧進展

enter image description here

現在我知道,我不能使用任何外部庫這樣做,因爲小部件不支持大部分的自定義視圖。我已經看到大多數開發人員使用位圖來繪製像這樣的東西。我可以設法畫一個完整的圈子。但是我怎樣才能使用位圖繪製這個弧形進度條,或者有什麼其他方法?

感謝你的幫助。謝謝!

回答

2

是的,你需要一個位圖,但它是很容易劃出一道弧線上的位圖,你會畫上一個自定義視圖的圓弧以同樣的方式:

Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    canvas.drawArc(arcRect, startAngle, sweepAngle, false, paint); 

    RemoteViews views = new RemoteViews(updateService.getPackageName(), R.layout.widget); 
    views.setImageViewBitmap(R.id.image_view, bitmap); 
+0

嗨克里斯,按照這個帖子http://stackoverflow.com/questions/4062559/android-appwidget-with-custom-view-not-working自定義視圖不被小部件的支持。我如何解決它?謝謝。 –

+0

哦'RemoteViews'部件。更新了答案。 –

+0

謝謝。完美的作品。 –

3

回答我的問題:

如果有人找這種小部件,我設法得到它的工作下面的代碼。希望這會幫助某人。

private Bitmap getWidgetBitmap(Context context, int percentage) { 

     int width = 400; 
     int height = 400; 
     int stroke = 30; 
     int padding = 5; 
     float density = context.getResources().getDisplayMetrics().density; 

     //Paint for arc stroke. 
     Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG | Paint.ANTI_ALIAS_FLAG); 
     paint.setStrokeWidth(stroke); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeCap(Paint.Cap.ROUND); 
     //paint.setStrokeJoin(Paint.Join.ROUND); 
     //paint.setPathEffect(new CornerPathEffect(10)); 

     //Paint for text values. 
     Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     mTextPaint.setTextSize((int) (context.getResources().getDimension(R.dimen.widget_text_large_value)/density)); 
     mTextPaint.setColor(Color.WHITE); 
     mTextPaint.setTextAlign(Paint.Align.CENTER); 

     final RectF arc = new RectF(); 
     arc.set((stroke/2) + padding, (stroke/2) + padding, width-padding-(stroke/2), height-padding-(stroke/2)); 

     Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(bitmap); 
     //First draw full arc as background. 
     paint.setColor(Color.argb(75, 255, 255, 255)); 
     canvas.drawArc(arc, 135, 275, false, paint); 
     //Then draw arc progress with actual value. 
     paint.setColor(Color.WHITE); 
     canvas.drawArc(arc, 135, 200, false, paint); 
     //Draw text value. 
     canvas.drawText(percentage + "%", bitmap.getWidth()/2, (bitmap.getHeight() - mTextPaint.ascent())/2, mTextPaint); 
     //Draw widget title. 
     mTextPaint.setTextSize((int) (context.getResources().getDimension(R.dimen.widget_text_large_title)/density)); 
     canvas.drawText(context.getString(R.string.widget_text_arc_battery), bitmap.getWidth()/2, bitmap.getHeight()-(stroke+padding), mTextPaint); 

     return bitmap; 
    } 

這產生以下。

enter image description here

謝謝!