android 中使用Canvas 画圆

来源:互联网 发布:行星和恒星的区别知乎 编辑:程序博客网 时间:2024/06/05 08:46

package com.example.wireframe;import android.content.Context;import android.content.res.Resources;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Paint.Align;import android.graphics.Paint.Style;import android.graphics.RectF;import android.view.View;import android.view.ViewGroup.LayoutParams;import android.view.ViewTreeObserver.OnPreDrawListener;/** * 圆弧计分 * @author Administrator */public class HomeArc extends View { private Paint paint_black, paint_white;private RectF rectf;private float tb;private int blackColor = 0x70000000; // 底黑色private int whiteColor = 0xddffffff; // 白色private int score;private float arc_y = 0f;private int score_text;public HomeArc(Context context, int score) {super(context);init(score);}public void init(int score) {this.score = score;Resources res = getResources();tb = res.getDimension(R.dimen.historyscore_tb);//画出背景颜色paint_black = new Paint();paint_black.setAntiAlias(true); //消除锯齿paint_black.setColor(blackColor); //设置背景颜色paint_black.setStrokeWidth(tb * 0.2f);paint_black.setStyle(Style.STROKE); //画出一个空心的圆   如果画出一个实心的话使用Paint.Style.FILL//画出弧形线paint_white = new Paint();paint_white.setAntiAlias(true);paint_white.setColor(whiteColor); paint_white.setTextSize(tb*6.0f);paint_white.setStrokeWidth(tb * 0.2f);paint_white.setTextAlign(Align.CENTER);paint_white.setStyle(Style.STROKE);rectf = new RectF();rectf.set(tb * 0.5f, tb * 0.5f, tb * 18.5f, tb * 18.5f);setLayoutParams(new LayoutParams((int) (tb * 19.5f), (int) (tb * 19.5f)));//View本身onDraw 方法的监听this.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {public boolean onPreDraw() {new thread(); //对绘画的监听getViewTreeObserver().removeOnPreDrawListener(this);return false;}});}protected void onDraw(Canvas c) {super.onDraw(c);c.drawArc(rectf, -90, 360, false, paint_black); //画出黑线圆c.drawArc(rectf, -90, arc_y, false, paint_white); //画出白线圆c.drawText("" + score_text, tb * 9.7f, tb * 11.0f, paint_white); //画出中间的文字//c.drawText(text, x, y, paint);  参数}class thread implements Runnable {private Thread thread;private int statek; int count;public thread() {thread = new Thread(this);thread.start();}public void run() {while (true) {switch (statek) {case 0:try {Thread.sleep(200);statek = 1;} catch (InterruptedException e) {}break;case 1:try {Thread.sleep(15);arc_y += 3.6f;score_text++;count++;//注: invalidate()是在UI线程中被调用的,而postInvalidate()是在mainThread中被调用postInvalidate();} catch (InterruptedException e) {e.printStackTrace();}break;}if (count >= score)break;}}}}

  先看看效果图




在程序中中调用:

LinearLayout arc = (LinearLayout) findViewById(R.id.arc);//圆弧计分
arc.addView(new HomeArc(this, 88)); 

0 0