最近用Canvas画图,发现画图的过程不能实时显示在ImageView上,虽然尝试了以下三种方法,仍然不行
按照google的一些建议添加了setWillNotDraw(false); 也不行
把画图过程写在onDraw里面,每隔一段时间imageView.invalidate(), 也不行。发现onDraw没有被调用的到。
后来又更改代码使得onDraw隔一段时间被调用一次,但是每次onDraw调用,都是在一个新的传进来的Canvas上画图,所以上次onDraw的图像是被清空的。而且onDraw只能通过消息队列触发invalidate(),才能把onDraw的结果呈现在imageView上,手动调用onDraw,手动传入Canvas,是不能正确呈现图像的。
那么怎么样才能让Canvas展现出动态的画图过程呢?重写了一个ImageView类,在这个类里面,用handler消息机制去控制每隔一段时间调用一次onDraw,然后每次onDraw的时候把以前画过得点重画一遍,由于画的速度非常快,视觉上呈现的效果就是动态的画图效果。
废话不多说,代码如下,这里想用三种颜色画三种不同的小动物,所以有三个队列存储各个小动物的坐标点。
package com.example.shirley.shirleysdemo.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
/**
* Created by shirley on 3/13/18.
*/
public class CanvasView extends AppCompatImageView {
private Logger logger = Logger.getLogger(CanvasView.class.toString());
private Paint paint;
public MyHandler myHandler;
private List<MyPoint> pointListForWa = new ArrayList<>();
private List<MyPoint> pointListForNiu = new Ar