动画---分块运动

news/2024/7/6 4:58:43 标签: android, canvas, 动画
动画---分块运动
package com.example.test;

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.PaintFlagsDrawFilter;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;

/**
 * 
 * @author Himi
 *
 */
public class MySurfaceView extends SurfaceView implements Callback, Runnable {
	private SurfaceHolder sfh;
	private Paint paint;
	private Thread th;
	private boolean flag;
	private Canvas canvas;
	private int screenW, screenH;
	//机器人位图
	private Bitmap bmpRobot;
	//机器人的方向常量
	private final int DIR_LEFT = 0;
	private final int DIR_RIGHT = 1;
	//机器人当前的方向(默认朝右方向)
	private int dir = DIR_RIGHT;
	//动作帧下标
	private int currentFrame;
	//机器人的X,Y位置
	private int robot_x, robot_y;
	//处理按键卡现象
	private boolean isUp, isDown, isLeft, isRight;

	/**
	 * SurfaceView初始化函数
	 */
	public MySurfaceView(Context context) {
		super(context);
		sfh = this.getHolder();
		sfh.addCallback(this);
		paint = new Paint();
		paint.setColor(Color.WHITE);
		paint.setAntiAlias(true);
		setFocusable(true);
		bmpRobot = BitmapFactory.decodeResource(this.getResources(), R.drawable.robot);
	}

	/**
	 * SurfaceView视图创建,响应此函数
	 */
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		screenW = this.getWidth();
		screenH = this.getHeight();
		flag = true;
		//实例线程
		th = new Thread(this);
		//启动线程
		th.start();
	}

	/**
	 * 
	 * @param currentFrame 绘制帧
	 * @param frameW  
	 * 			每帧的高
	 * @param frameH 
	 * 			每帧的高
	 * @param canvas  
	 * 			画布实例
	 * @param paint	     
	 * 			 画笔实例
	 */
	public void drawFrame(int currentFrame, Canvas canvas, Paint paint) {
		int frameW = bmpRobot.getWidth() / 6;
		int frameH = bmpRobot.getHeight() / 2;
		//得到位图的列数
		int col = bmpRobot.getWidth() / frameW;
		//得到当前帧相对于位图的X坐标
		int x = currentFrame % col * frameW;
		//得到当前帧相对于位图的Y坐标
		int y = currentFrame / col * frameH;
		canvas.save();
		//设置一个宽高与机器人每帧相同大小的可视区域
		canvas.clipRect(robot_x, robot_y, robot_x + bmpRobot.getWidth() / 6, robot_y + bmpRobot.getHeight() / 2);
		if (dir == DIR_LEFT) {//如果是向左侧移动
			//镜像操作
			canvas.scale(-1, 1, robot_x - x + bmpRobot.getWidth() / 2, robot_y - y + bmpRobot.getHeight() / 2);
		}
		canvas.drawBitmap(bmpRobot, robot_x - x, robot_y - y, paint);
		canvas.restore();
	}

	/**
	 * 游戏绘图
	 */
	public void myDraw() {
		try {
			canvas = sfh.lockCanvas();
			if (canvas != null) {
				canvas.drawColor(Color.BLACK);
				drawFrame(currentFrame, canvas, paint);
			}
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (canvas != null)
				sfh.unlockCanvasAndPost(canvas);
		}
	}

	@Override
	public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
		Log.e("", "aaaaaaa");
		return super.onKeyMultiple(keyCode, repeatCount, event);
	}

	/**
	 * 触屏事件监听
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		return true;
	}

	/**
	 * 按键事件监听
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
			isUp = true;
		}
		if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
			isDown = true;
		}
		if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
			isLeft = true;
			dir = DIR_LEFT;
		}
		if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
			isRight = true;
			dir = DIR_RIGHT;
		}
		return super.onKeyDown(keyCode, event);
	}

	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
			isUp = false;
		}
		if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
			isDown = false;
		}
		if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
			isLeft = false;
		}
		if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
			isRight = false;
		}
		return super.onKeyUp(keyCode, event);
	}

	/**
	 * 游戏逻辑
	 */
	private void logic() {
		if (isUp) {
			robot_y -= 5;
		}
		if (isDown) {
			robot_y += 5;
		}
		if (isLeft) {
			robot_x -= 5;
		}
		if (isRight) {
			robot_x += 5;
		}
		currentFrame++;
		if (currentFrame >= 12) {
			currentFrame = 0;
		}
	}

	@Override
	public void run() {
		while (flag) {
			long start = System.currentTimeMillis();
			myDraw();
			logic();
			long end = System.currentTimeMillis();
			try {
				if (end - start < 50) {
					Thread.sleep(50 - (end - start));
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * SurfaceView视图状态发生改变,响应此函数
	 */
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
	}

	/**
	 * SurfaceView视图消亡时,响应此函数
	 */
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		flag = false;
	}
}


http://www.niftyadmin.cn/n/1335554.html

相关文章

爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!

1 前言近期&#xff0c;有些朋友问我一些关于如何应对反爬虫的问题。由于好多朋友都在问&#xff0c;因此决定写一篇此类的博客。把我知道的一些方法&#xff0c;分享给大家。博主属于小菜级别&#xff0c;玩爬虫也完全是处于兴趣爱好&#xff0c;如有不足之处&#xff0c;还望…

组件prop检验

Vue.js中的父子组件相信都已经是大家很常用到的功能了&#xff0c; 父组件通过props属性向子组件传值子组件通过自定义事件向父组件传值 那么我们怎么去校验props属性中的类型呢 笔者列出以下几种方法&#xff1a; 1&#xff1a;直接检测 如果将 string 换成Number 那么在控制台…

网上下载文档需要付费?试试这几招,老师傅一般都会使用

平时在上网找资料时候&#xff0c;当发现下载时候需要付费&#xff0c;我们一般该怎么办呢&#xff1f;扎心啦老铁&#xff0c;难道你就甘心放弃现在找到的文档资料&#xff1f; 其实不用的啦&#xff01;这里为大家汇总了几个下载文档的方法&#xff0c;大家如果有什么需要下…

也谈GB28181码流收发

1.前置文章 PS封装格式&#xff1a;GB28181协议RTP传输 H265的国标PS流打包 这两篇文章里面有的就不细说了 2.发送的规则细节 在国标中&#xff0c;不需要对H264/H265裸流进行进一步的去NAL等操作&#xff0c;直接发裸流即可。如果一个包发不下&#xff0c;可以分包发送&a…

教你把多个视频合并成一个视频的方法

前几天朋友向我请教视频合并的方法&#xff0c;而说起视频合并相信大部分小伙伴都听说过&#xff0c;但是当中也有部分小伙伴不知道怎么合并视频&#xff08;多个视频合并成一个视频&#xff09;。下面就来教大家用迅捷视频转换器把多个视频合并成一个视频的方法。 第一步&…

查询浏览器是否支持html5

js判断 插入js代码 <script> window.onload function() { if (window.applicationCache) { alert("你的浏览器支持HTML5"); } else { alert("你的浏览器不支持HTML5"); } } </script> 2原生标签兼容 <body> <canvas style"bac…

【转】自定义修改Nginx的server

nginx版本暴露会留下不少麻烦&#xff1b;索性一不做二不休&#xff0c;名字也改掉。 1 修改server要在编译Nginx修改/src/core/nginx.h文件 #define NGINX_VERSION "1.20" #define NGINX_VER "mywebserver" 2 修改src/http/ngx_http_header_…

100套精品PPT模板免费拿!以后再也不用怕老板叫你制作PPT了

你还在怕老板叫你制作PPT吗&#xff1f; 说真的制作PPT好麻烦哦&#xff01;不仅需要提前找好素材&#xff0c;还需要规划好制作的思路&#xff0c;如果不是太熟练的话&#xff0c;需要2~3个小时才能制作好&#xff01; 其实不必要那么麻烦啦&#xff01;老板布置下来的任务我…