求解://bitmap为一个大图
//Canvas c
//Handler handler
//ra为一个Runnable用来不断执行下面的操作
bm = Bitmap.createBitmap(bitmap, 0, i*20, 480, 20);
Log.w("draw", "draw ok " + i);
c.save();
c.drawBitmap(bm, 0, i * 20, paint);
i++;
c.restore();
handler.postDelayed(ra, 10);循环执行上面的操作画出来的效果却如下:

解决方案 »

  1.   

    不明白你要什么效果  是不是没限制画布大小canvas.clipRect(0, 0,100,100);
      

  2.   

    完整代码public class LiveWallpaperTestActivity extends WallpaperService{ @Override
    public Engine onCreateEngine() {
    return new MyEngin();
    }

    public class MyEngin extends Engine{

    private Paint paint;
    private Canvas c;
    private Handler handler = new Handler();
         private int i = 0;
         private Bitmap bitmap;

    public MyEngin(){
    paint = new Paint();
    } @Override
    public void onSurfaceCreated(SurfaceHolder holder) {
    super.onSurfaceCreated(holder);
    Log.w("onSurfaceCreated", "onSurfaceCreated");
             bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sunset);
    drawFrame();
    } @Override
    public void onSurfaceDestroyed(SurfaceHolder holder) {
    super.onSurfaceDestroyed(holder);
    }

    void drawFrame() {
                final SurfaceHolder holder = getSurfaceHolder();            try {
                    c = holder.lockCanvas();
                    if (c != null) {
                     Bitmap bm = null;
                     if(i<20){
                        
                         Log.w("draw", "draw ok " + i * 20);
                         c.save();
                         bm = Bitmap.createBitmap(bitmap, 0, i * 20, 400, 20);
                         c.drawBitmap(bm, 0, i * 20, paint);
                         c.restore();
                         handler.postDelayed(ra, 10);
                     } else {
                     i=0;
                     }
                    }
                } finally {
                    if (c != null) holder.unlockCanvasAndPost(c);
                }
            }

    private Runnable ra = new Runnable(){
    @Override
    public void run() {
                 i++;
    drawFrame();
    }
    };

    }}
      

  3.   

    不好意思,我以前的结论是:不能把循环用于canvas
      

  4.   

    这个简单,昨天刚做了个类似的,package com.kinglo;import java.util.Timer;
    import java.util.TimerTask;import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.os.Bundle;
    import android.view.Display;
    import android.view.View;
    import android.view.WindowManager;public class AndroidTest01Activity extends Activity
    { public int tableWidth;
    public int tableHeight;
    public int startY = 0; /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    WindowManager wm = getWindowManager();
    Display display = wm.getDefaultDisplay();
    tableWidth = display.getWidth();
    tableHeight = display.getHeight();
    setContentView(new MyView(this));
    } class MyView extends View
    {
    Bitmap imgBm = null; public MyView(Context context)
    {
    super(context);
    imgBm = BitmapFactory.decodeResource(getResources(), R.drawable.b); //加载图片
    imgBm = imgBm.createScaledBitmap(imgBm, 500, tableHeight +500, true);//放大图片
    TimerTask task = new TimerTask()
    {

    @Override
    public void run()
    {
    if(startY <=0)
    startY = tableHeight - 500;
    else
    startY --;
    postInvalidate();

    }
    };
    new Timer().schedule(task, 0,100);
    } @Override
    protected void onDraw(Canvas canvas)
    {
    super.onDraw(canvas);
    Bitmap bitmap = Bitmap.createBitmap(imgBm, 0, startY, imgBm.getWidth(), tableHeight);
    canvas.drawBitmap(bitmap, 0,0,null);
    } }
    }
      

  5.   

    你主要是没有加时间控制!
    做个TimerTask来控制延迟,希望对你有帮助!