2

In meiner Android App habe ich ein paar Widgets und ich will, dass sie wie diese Fortschrittsbalken aussehen.Android Widget Arc Progress

enter image description here

Jetzt weiß ich, dass ich keine externen Libs, dies zu tun verwenden können als Widgets meisten der benutzerdefinierten Ansichten unterstützen nicht. Ich habe gesehen, dass die meisten Entwickler Bitmap verwenden, um solche Dinge zu zeichnen. Ich schaffe es, einen vollen Kreis zu ziehen. Aber wie kann ich diesen Bogenform-Fortschrittsbalken mit Bitmap zeichnen oder gibt es einen anderen Weg?

Schätzen Sie Ihre Hilfe. Vielen Dank!

Antwort

2

Ja, benötigen Sie eine Bitmap, aber es ist leicht genug, um einen Bogen auf einem Bitmap auf die gleiche Weise zeichnen Sie einen Bogen auf einer benutzerdefinierten Ansicht ziehen würde:

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

Hallo Kris, nach diesem Beitrag http://stackoverflow.com/questions/4062559/android-appwidget-with-custom-view-not-working benutzerdefinierte Ansichten werden nicht von Widgets unterstützt. Wie arbeite ich daran? Vielen Dank. –

+0

Oh, 'RemoteViews' Widget. Aktualisierte Antwort –

+0

Danke. Funktioniert perfekt. –

3

meine eigene Frage zu beantworten:

Wenn jemand auf der Suche nach dieser Art von Widget, ich habe es geschafft, funktioniert es nach Code. Hoffe, das wird jemandem helfen.

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; 
    } 

Dies ergab folgende.

enter image description here

Dank!