以前一直使用序列图片来实现动画效果,造成空间的极大浪费,所以想要尝试下切割图片来实现动画。

如图所示,是由66rpg纸娃娃系统生成的角色行走图。本程序必须实现将人物的整体图片切割后存入4x4的数组来动态加载。

在主布局文件中设立4个ImageView,分别用来显示角色在不同角度下的行走动作。然后在主活动文件中:

public class MainActivity extends ActionBarActivity {
private ImageView myImageView,myImageView2,myImageView3,myImageView4;//
private Handler myHandler;//定义线程运行标识
private Boolean iswalking=true;

class myThread extends Thread{
@Override
public void run(){
int what=1;
while(iswalking){
myHandler.sendEmptyMessage((what++)%4);//每次生成0-3间依次增加的的数字,用来充当图片数组的下标。
try{
Thread.sleep(250);//每250毫秒睡眠一次
}
catch(InterruptedException e){
e.printStackTrace();
}}}}
在主活动文件中建立线程类,用于定时给Handler对象传递参数。

public Bitmap BitmapClipBitmap(Bitmap bitmap,int x,int y,int w,int h){
return Bitmap.createBitmap(bitmap, x, y, w,h);
}

public Bitmap ReadBitmap(Context context, int resId){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
//图片的输入流
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is, null, opt);
}

这两个方法分别用来切割图片和读取图片信息。ReadBitmap的Context参数可在调用处使用getApplicationContext()

来传递。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

final int ANIM_COUNT=4,ANIM_DOWN=0,ANIM_LEFT=1,ANIM_RIGHT=2,ANIM_UP=3;
Context context=getApplicationContext();//获取Context
Bitmap testmap = ReadBitmap(context,R.drawable.girl);
final Bitmap [][]bitmap = new Bitmap[ANIM_COUNT][ANIM_COUNT]; //建立4x4二维数组用来存储4个角度的图片
int tileWidth = testmap.getWidth() / ANIM_COUNT;
int tileHeight = testmap.getHeight() / ANIM_COUNT;
int i = 0,x = 0,y = 0;
for(i =0; i < ANIM_COUNT; i++) {
y = 0;
bitmap[ANIM_DOWN][i] = BitmapClipBitmap(testmap,x,y,tileWidth,tileHeight);
y+=tileHeight;
bitmap[ANIM_LEFT][i] = BitmapClipBitmap(testmap,x,y,tileWidth,tileHeight);
y+=tileHeight;
bitmap[ANIM_RIGHT][i] = BitmapClipBitmap(testmap,x,y,tileWidth,tileHeight);
y+=tileHeight;
bitmap[ANIM_UP][i] = BitmapClipBitmap(testmap,x,y,tileWidth,tileHeight);
x+= tileWidth;

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//设置屏幕为横向
myImageView=(ImageView)findViewById(R.id.myImageView);
myImageView2=(ImageView)findViewById(R.id.myImageView2);
myImageView3=(ImageView)findViewById(R.id.myImageView3);
myImageView4=(ImageView)findViewById(R.id.myImageView4);
myHandler=new Handler(){//实例化Handler对象
@Override
public void handleMessage(Message msg){//接收消息
super.handleMessage(msg);
myImageView.setImageBitmap(bitmap[ANIM_DOWN][msg.what]);//设置ImageView中所要加载的位图
myImageView2.setImageBitmap(bitmap[ANIM_LEFT][msg.what]);
myImageView3.setImageBitmap(bitmap[ANIM_RIGHT][msg.what]);
myImageView4.setImageBitmap(bitmap[ANIM_UP][msg.what]);
}
};
new myThread().start();
}
}
}

1.通过该图片的宽度和高度,和定义的Tile的宽度和高度,可以切割出16张所需要的帧图像,testmap就为待切割总图。

2.根据人物上下左右行走,可以分为四段动画,可以定义一个长度为4的动画数组。

3.最终实现在屏幕上同时显示四个以不同角度呈现的人物行走状态。

参考资料:http://blog.csdn.net/duancanmeng/article/details/7261900

http://blog.sina.com.cn/s/blog_89429f6d0101188f.html

Android 游戏开发案例教程 第4章

最新文章

  1. 【解决方案】Myeclipse 10 安装 GIT 插件 集成 步骤 图解
  2. mysql 主从复制实现步骤
  3. CI框架源码阅读笔记9 CI的自动加载机制autoload
  4. bzoj4403: 序列统计
  5. Ubuntu和Windows的交互工具---Samba环境配置
  6. C++ 通过WIN32 API 获取逻辑磁盘详细信息
  7. QUnit使用笔记-3测试用户操作
  8. DB2中循环日期跑数据
  9. (转) CS0234: 命名空间“System.Web.Mvc”中不存在类型或命名空间名称“Ajax”(是否缺少程序集引用?)
  10. 2014 ACM/ICPC Asia Regional Beijing Site
  11. Android的root学习
  12. pt工具主从一致性检查并修复以及版本3.0.4的版本缺点
  13. LeetCode算法题-Largest Number At Least Twice of Others(Java实现)
  14. 箭头函数里this理解
  15. 解决Table不继承父节点的属性的方法
  16. 用织梦建站如何去掉a这个目录,还有内容页的a
  17. 目前php连接mysql的主要方式
  18. 2018 ACM 网络选拔赛 沈阳赛区
  19. web3.js编译Solidity,发布,调用全部流程(手把手教程)
  20. AS3 内存基础

热门文章

  1. delphi crc校验函数
  2. JS方面重点摘要(一)
  3. 深入理解dataset及其用法
  4. asp.net自制分页页码条控件
  5. Android开发Tips(2)
  6. ListView控件绑定DataSet
  7. ajty
  8. [PWA] Disable Text Selection and Touch Callouts in a PWA on iOS
  9. 求出数组中所有数字的和&amp;&amp;弹出层效果
  10. requirejs主流程解读