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

如图所示,是由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章

Android 中通过切割图片创建人物行走动画的更多相关文章

  1. android中使用Nine-Patch图片

    android中可以把图片进行处理,如果图片被拉伸的话,允许让图片部分区域不拉伸,部分区域拉伸.这个功能非常好,比如聊天的气泡,如果整个气泡被拉伸的话,会非常的丑. 老版的sdk中提供的有draw9p ...

  2. Android中常见的图片加载框架

    图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...

  3. 在android中画圆形图片的几种办法

    在开发中常常会有一些需求,比方显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其它的一些形状. 可是往往我们手上的图片或者从server获取到的图片都是方形的.这时候就须要我们自己进行处理, ...

  4. Android中应用contentprovider来创建数据库的一些步骤

    http://blog.csdn.net/xiaodongvtion/article/details/7865669 1:首先创建一个xxprovider的class,它是extendscontent ...

  5. Android中在sdcard上创建文件夹

    //在SD卡上创建一个文件夹    public void createSDCardDir(){     if(Environment.MEDIA_MOUNTED.equals(Environment ...

  6. Android中设定背景图片平铺。

    注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 在做Android开发时,我们常常需要为程序设定一个背景,但由于现在的Android设备尺寸不一,如果随便设置一个图片为背景,那么很 ...

  7. android中对Bitmap图片设置任意角为圆角

    http://blog.csdn.net/l448288137/article/details/48276681 最近项目开发中使用到了圆角图片,网上找到的圆角图片控件大多比较死板,只可以全圆角.其中 ...

  8. Android中获取选择图片与获取拍照返回结果差异

    导语: 如今的安卓应用在选择图片的处理上大多合并使用拍照和从相册中选择这两种方式 今天在写一个这样的功能时遇到一个尴尬的问题,同样是拍照获取图片功能,在不同手机上运行的效果不一样,下面是在某型手机上测 ...

  9. Android中处理大图片时图片压缩

    1.BitmapFactory.Options中的属性 在进行图片压缩时,是通过设置BitmapFactory.Options的一些值来改变图片的属性的,下面我们来看看BitmapFactory.Op ...

随机推荐

  1. 彻底理解H5的DOM事件

    我们大家都知道,人与人之间的交流可以通过语言,文字,肢体动作,面部微表情等,但是你知道Javascript和HTML之间是通过什么进行交互的么?你又知道Javascript和HTML之间是如何进行交互 ...

  2. 跟着Sedgewick学算法(week 1 ElementarySort)

     链接https://www.evernote.com/shard/s408/sh/dbe0167f-20e0-41c4-a49b-75717ad98695/461148482ffb6add092be ...

  3. ncurses简单的一个多窗体程序

    #include <ncurses.h> #include <string.h> #include <iostream> #include <stdlib.h ...

  4. 机器学习第2课:单变量线性回归(Linear Regression with One Variable)

    2.1  模型表示 之前的房屋交易问题为例,假使我们回归问题的训练集(Training Set)如下表所示: 我们将要用来描述这个回归问题的标记如下: m                代表训练集中实 ...

  5. EffectiveJava(4)通过私有构造器强化不可实例化的能力

    通过私有构造器强化不可实例化的能力 原理:只有当类不包含显式的构造器时,编译器才会生成缺省的构造器,因此只要让这个类包含私有构造器,他就不能被实例化 这种方式下,子类没有可访问的超类构造器可调用 // ...

  6. 不在JPA 的 persistence.xml 文件里配置Entity class的解决的方法

     在Spring 集成 Hibernate 的JPA方式中,须要在persistence配置文件里定义每个实体类.这样很地不方便.2种方法能够解决此问题: 这2种方式都能够实现不用在persist ...

  7. Python学习笔记(一)类和继承的使用

    一年前就打算学Python了,折腾来折腾去也一直没有用熟练,主要是类那一块不熟,昨天用Python写了几个网络编程的示例,感觉一下子迈进了很多.这几天把学习Python的笔记整理一下,内容尽量简洁. ...

  8. Ant Design Mobile 使用 rc-form

    引入: import { createForm } from 'rc-form'; 步骤一:绑定 form // 将form表单的api绑定到props,便于调用 const EditHeaderWr ...

  9. 【Excle】使用&拼接,拼接后复制到文本编辑器存在引号(“”)问题

    1.错误的操作 如下图:拼接 拼接后,复制到文本编辑器: 1.1错误原因 出现上述问题的原因:是由于在拼接字符串的时候, INSERT INTO CST(ID,NAME)values( 上述这段字符& ...

  10. 删除数据库时提示数据库正在被使用,无法删除(Cannot drop database databasename because it is currently in use)的问题

    删除数据库时提示数据库正在被使用,无法删除(Cannot drop database databasename because it is currently in use)的问题   删除数据库时提 ...