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();重绘

    评论

报告相同问题?

悬赏问题

  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样