Android 中通过切割图片创建人物行走动画
以前一直使用序列图片来实现动画效果,造成空间的极大浪费,所以想要尝试下切割图片来实现动画。

如图所示,是由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 中通过切割图片创建人物行走动画的更多相关文章
- android中使用Nine-Patch图片
		
android中可以把图片进行处理,如果图片被拉伸的话,允许让图片部分区域不拉伸,部分区域拉伸.这个功能非常好,比如聊天的气泡,如果整个气泡被拉伸的话,会非常的丑. 老版的sdk中提供的有draw9p ...
 - Android中常见的图片加载框架
		
图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...
 - 在android中画圆形图片的几种办法
		
在开发中常常会有一些需求,比方显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其它的一些形状. 可是往往我们手上的图片或者从server获取到的图片都是方形的.这时候就须要我们自己进行处理, ...
 - Android中应用contentprovider来创建数据库的一些步骤
		
http://blog.csdn.net/xiaodongvtion/article/details/7865669 1:首先创建一个xxprovider的class,它是extendscontent ...
 - Android中在sdcard上创建文件夹
		
//在SD卡上创建一个文件夹 public void createSDCardDir(){ if(Environment.MEDIA_MOUNTED.equals(Environment ...
 - Android中设定背景图片平铺。
		
注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 在做Android开发时,我们常常需要为程序设定一个背景,但由于现在的Android设备尺寸不一,如果随便设置一个图片为背景,那么很 ...
 - android中对Bitmap图片设置任意角为圆角
		
http://blog.csdn.net/l448288137/article/details/48276681 最近项目开发中使用到了圆角图片,网上找到的圆角图片控件大多比较死板,只可以全圆角.其中 ...
 - Android中获取选择图片与获取拍照返回结果差异
		
导语: 如今的安卓应用在选择图片的处理上大多合并使用拍照和从相册中选择这两种方式 今天在写一个这样的功能时遇到一个尴尬的问题,同样是拍照获取图片功能,在不同手机上运行的效果不一样,下面是在某型手机上测 ...
 - Android中处理大图片时图片压缩
		
1.BitmapFactory.Options中的属性 在进行图片压缩时,是通过设置BitmapFactory.Options的一些值来改变图片的属性的,下面我们来看看BitmapFactory.Op ...
 
随机推荐
- SQL使用链接服务器执行远程数据库上的存储过程
			
原文:SQL使用链接服务器执行远程数据库上的存储过程 --创建链接服务器 exec sp_addlinkedserver'server_tmp','','SQLOLEDB','远程服务器名或ip地址' ...
 - ubuntu-kvm上面deploy qcow2格式虚拟机
			
ubuntu-kvm完成后,将xxx.qcow2格式的镜像拷贝到ubuntu-kvm这个虚拟机上面去. 1. 若是ubuntu server没有图形界面,可以先安装desktop,参考http://w ...
 - 【微信】微信小程序 新建页面目录后,怎么自动生成目中的的四个基本文件呢? 新建目录报错如下VM458:2 未找到 app.json 中的定义的 pages "pages/module/module" 对应的 WXML 文件
			
如下图,在使用微信开发者工具过程中,新创建了页面目录,想要页面文件夹中自动生成四个基本文件 但是新创建了一个页面文件夹,里面的四个基本文件并没有展示出来 然后在app.json添加这个路径,ctrl+ ...
 - linux下小试redis demo
			
先启动 redis-server /etc/redis/redis.conf package com.test; import java.util.ArrayList; import java.ut ...
 - 控制流程完整性:给大家介绍一种“另类”的Javascript反分析技术
			
写在前面的话 理解恶意软件的真实代码对恶意软件分析人员来说是非常有优势的,因为这样才能够真正了解恶意软件所要做的事情.但不幸的是,我们并不总是能够得到“真实”的代码,有时恶意软件分析人员可能需要类似反 ...
 - http://blog.csdn.net/emoven/article/details/12999265
			
http://blog.csdn.net/emoven/article/details/12999265
 - 【共享单车】—— React后台管理系统开发手记:权限设置和菜单调整(未完)
			
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
 - 2017.9.15 mybatis批量插入后实现主键回填
			
参考来自:mybatis mysql 批量insert 返回主键 注意:必须要在mybatis3.3.1及其以上才能实现. 1.service List branchEntryList = (Arra ...
 - 2017.7.18 linux下ELK环境搭建
			
参考来自:Linux日志分析ELK环境搭建 另一篇博文:2017.7.18 windows下ELK环境搭建 0 版本说明 因为ELK从5.0开始只支持jdk 1.8,但是项目中使用的是JDK 1 ...
 - [Create_Cdi]
			
bbb 原理:游标就是把数据按照指定要求提取出相应的数据集,然后逐条进行数据处理.1.1游标的概念 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor ...