先看效果:
代码实现:
import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.view.SurfaceHolder; import android.view.SurfaceView; /** * 奔跑的小人 * * @author shaoshuai * */ public class RunManView extends SurfaceView { private SurfaceHolder holder; /** 画布 */ private Canvas mCanvas; /** 画笔 */ private Paint mPaint; /** 视图宽度 */ private int mWidth; /** 视图高度 */ private int mHeight; /** 背景 */ private Bitmap mBg1; /** 奔跑的小人 */ private Bitmap mPlay1; /** 每一帧的动画时间 */ private int Time = 50; /** 当前图片的动画帧 */ private int mPicPosition = 0;// 动画共10帧,开始为0 /** 执行动作 */ private Runnable runnable = new Runnable() { @Override public void run() { myDraw(); } }; public RunManView(Context context, AttributeSet attrs) { super(context, attrs); holder = this.getHolder(); holder.addCallback(callBack); mPaint = new Paint(); mPaint.setColor(Color.YELLOW); BitmapFactory.Options ops = new BitmapFactory.Options(); mBg1 = BitmapFactory.decodeResource(this.getResources(), R.drawable.bg1, ops); mPlay1 = BitmapFactory.decodeResource(getResources(), R.drawable.dartman, ops); } SurfaceHolder.Callback callBack = new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 获取屏幕宽高 mWidth = width; mHeight = height; // mRect = new Rect(0, 0, mWidth, mHeight); new Thread(runnable).start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { } }; private void myDraw() { int toLeft = 300;// 距离左侧宽度 int toTop = mHeight - 100;// 距离顶部高度 if (toLeft > mWidth) { toLeft = 0; } while (true) { try { Rect mClipRect = new Rect(toLeft, toTop, toLeft + mPlay1.getWidth() / 10, toTop - mPlay1.getHeight()); mCanvas = holder.lockCanvas(); if (mCanvas != null) { // 画背景 mCanvas.drawBitmap(mBg1, null, new Rect(0, 0, mWidth, mHeight), mPaint); mCanvas.save();// 保存当前状态 mCanvas.clipRect(mClipRect);// 裁剪区域 // 画小人 mCanvas.drawBitmap(mPlay1, toLeft - mPicPosition * mPlay1.getWidth() / 10, toTop - mPlay1.getHeight(), mPaint); mCanvas.restore();// 取出保存状态 mPicPosition++;// 步子加1 // 无限循环跑动 if (mPicPosition > 9) { mPicPosition = 0; } } } catch (Exception e) { e.printStackTrace(); } finally { if (mCanvas != null) { holder.unlockCanvasAndPost(mCanvas); } } try { Thread.sleep(Time); } catch (InterruptedException e) { e.printStackTrace(); } } } }
相应的资源文件:
dartman.png
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-09 21:01:44