Even_P 2015-12-23 01:51 采纳率: 57.1%
浏览 2584

Android中用canvas如何绘制动态图?请大神速回,在线等!!

public class MyView extends View {
private Paint paint;
private int roundColor, roundProgressColor;
private float roundWidth;
private int style;
private int process = 1;
private Canvas mcanvas;
private RectF oval;

public MyView(Context context) {
    this(context, null);
}

public MyView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    paint = new Paint();
    TypedArray mtypeArray = context.obtainStyledAttributes(attrs, R.styleable.RoundProgressBar);
    roundColor = mtypeArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED);
    roundWidth = mtypeArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 15);
    roundProgressColor = mtypeArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.GREEN);
    style = mtypeArray.getInt(R.styleable.RoundProgressBar_style, 0);

    mtypeArray.recycle();

}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int center = getWidth() / 2;
    int radius = (int) (center - roundWidth / 2);

//
// paint.setColor(roundColor);
// paint.setStyle(Paint.Style.STROKE);
// paint.setStrokeWidth(roundWidth);
// paint.setAntiAlias(true);
// PathEffect effects = new DashPathEffect(new float[]{10,10,10,10},1);
// paint.setPathEffect(effects);
// canvas.drawCircle(center, center, radius, paint);

    paint.setStrokeWidth(roundWidth);
    paint.setColor(roundProgressColor);
    oval = new RectF(center - radius, center - radius, center + radius, center + radius);
    paint.setStyle(Paint.Style.STROKE);
    PathEffect effects = new DashPathEffect(new float[]{10, 10, 10, 10}, 1);
    paint.setAntiAlias(true);
    paint.setPathEffect(effects);
    canvas.drawArc(oval, 120, 30*process%300, false, paint);
    mcanvas = canvas;
    Log.i("pan", "meiyoujinlai");
    Log.i("pan", canvas.toString() + "meiyou");
    new Thread() {
        @Override
        public void run() {
            super.run();
            Message msg = new Message();
            msg.what = 1;

            while (true) {
                try {

                    mHandler.sendMessage(msg);
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }


        }
    }.start();

}


private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (msg.what == 1) {
            Log.i("pan", "xianchengzaifa!!");
            Log.i("pan", mcanvas + "is value");

            mcanvas.drawArc(oval, 120, process % 300, false, paint);
            process += 20;

        }
    }
};

}
上面是我的代码,下面是我的效果图图片说明。这是我想实现的动态效果:图片说明

  • 写回答

1条回答

  • Tony_zcq 2015-12-23 09:34
    关注

    首先尽可能不要onDraw方法里实例对象,你可能在MyView构造方法里创建后一个线程,在线程了计算弧度大小,然后调用postInvalidate();重绘

    评论

报告相同问题?

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试