利用View类的postInvalidate()方法进行重绘,一边加载图片,一边重绘,只要你控制好同步问题就没问题

解决方案 »

  1.   

    用一个handle来通知绘图,起个子线程去加载图片数据,然后每个图片加载完毕通知handler,handler去sendmessage告诉UI绘制图片
    一般游戏加载地图的时候你都能看到有个loading...的提示,如果图片资源不多,那还是可以一边显示一边加载的
      

  2.   

    执行postInvalidate()可以在线程里强制调 onDraw 实现绘制,当然handler中直接用Invalidate()即可,绘制过程你可以采取线程同步方式,具体的你可以参考下android的一些小游戏的源码,比如俄罗斯方块,或者android sdk中的贪食蛇例子等等
      

  3.   

    听说SurfaceView不用handler就能实现View中使用handler来实现的刷新功能,具体怎么样呢?能有人跟我说说吗?
      

  4.   

    给你一个例子public class GameSurfaceView extends SurfaceView implements Runnable, Callback { // 控制循环
    boolean mbLoop = false; // 定义 SurfaceHolder 对象
    SurfaceHolder myHolder = null;
    int count = 0;
    int y = 50; public GameSurfaceView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub // 实例化 Surfaceholder
    myHolder = this.getHolder(); // 添加回调
    myHolder.addCallback(GameSurfaceView.this);
    GameSurfaceView.this.setFocusable(true);
    mbLoop = true;
    } // 绘图循环
    public void run() {
    // TODO Auto-generated method stub
    while (mbLoop) {
    try {
    Thread.sleep(1000);
    } catch (Exception e) { }
    synchronized (myHolder) {
    Draw();
    }
    } } // 在 Surface 的大小发生改变时激发
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
    // TODO Auto-generated method stub } // 在 Surface 创建时触发
    public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    // 开启绘图线程
    new Thread(GameSurfaceView.this).start(); } // 在 Surface 销毁时触发
    public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    // 停止循环
    mbLoop = false; } // 绘图方法
    public void Draw() {
    // 锁定画布,得到 canvas
    Canvas canvas = myHolder.lockCanvas(); if (myHolder == null || canvas == null) {
    return;
    } if (count < 100) {
    count++;
    } else {
    count = 0;
    } // 绘图
    Paint myPaint = new Paint();
    myPaint.setAntiAlias(true);
    myPaint.setColor(Color.BLACK);
    // 绘制矩形——清屏作用
    canvas.drawRect(0, 0, 320, 480, myPaint); switch (count % 4) {
    case 0:
    myPaint.setColor(Color.BLUE);
    break;
    case 1:
    myPaint.setColor(Color.GREEN);
    break;
    case 2:
    myPaint.setColor(Color.RED);
    break;
    case 3:
    myPaint.setColor(Color.YELLOW);
    break;
    default:
    myPaint.setColor(Color.WHITE);
    break;
    }
    // 绘制圆形
    canvas.drawCircle((320 - 25) / 2, y, 50, myPaint);
    // 绘制后解锁,必须解锁才能显示
    myHolder.unlockCanvasAndPost(canvas);
    }}