学徒浅析Android开发:第十四讲——Frame动画的滚屏操作
来源:互联网 发布:程序员文本编辑器排行 编辑:程序博客网 时间:2024/04/28 16:03
上一讲中,小编给大家介绍了Tween动画,今天小编给大家介绍一下Frame动画的制作,Frame动画就是换图(切帧),将若干张图片组成图组按一定的次序依次显示。这种图组可以是将一张图分割成若干张也可以是若干张完整的图。通过线程控制图片的切换,从而实现动画,今天带给大家的DEMO中有一个动画,我将向大家展示滚屏动画的实现方法。
package com.example.scrollview;/** * @author Arthur Lee * @date 08/22/2014 * */import android.os.Bundle;import android.app.Activity;import android.content.pm.ActivityInfo;import android.view.Menu;import android.view.Window;import android.view.WindowManager;public class MainActivity extends Activity{ GameView gameView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); gameView = new GameView(this); setContentView(gameView); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }}
package com.example.scrollview;/** * @author Arthur Lee * @date 08/22/2014 * */import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;public class GameView extends SurfaceView implements SurfaceHolder.Callback{ MainActivity mainActivity; Bitmap backgroundBitmap;//缩放前的背景图 Bitmap background;//缩放后的背景图 Bitmap[] backgrounds;//背景图切片数组 int length;//背景图切片数组,由当前屏幕宽度决定其值 Paint paint; int pictureW = 10,pictureH = 540; int screenW,screenH;//获取屏幕宽高 int backGroundIX = 0;//核心图的x坐标 int i = 0;//核心图的索引 TutoriolThread thread; BackGroundThread bgThread; public GameView(MainActivity mainActivity) { super(mainActivity); // TODO Auto-generated constructor stub getHolder().addCallback(this);//注册接口 this.mainActivity = mainActivity; this.thread = new TutoriolThread(getHolder(), this); this.bgThread = new BackGroundThread(this); } public void initPicture(){ paint = new Paint(); paint.setColor(Color.BLACK); backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.beeground);//获取背景图 background = Bitmap.createScaledBitmap(backgroundBitmap, screenW, screenH, true);//对背景图进行缩放,以适应当前屏幕的大小。 length = screenW/10+((screenW%10==0)?0:1);//获取切片数目 pictureH = screenH; pictureW = 10; backgrounds = new Bitmap[length];//背景图切片数组 for(int i=0;i<backgrounds.length;i++){ backgrounds[i] = Bitmap.createBitmap(background, pictureW*i, 0, pictureW, pictureH); } //释放无用图片占据的空间。 backgroundBitmap = null; background = null; } public void drawPicture(Canvas canvas){ int backGroundIX=this.backGroundIX; int i=this.i; //解决i左侧的问题 if(backGroundIX>0){ int n=(backGroundIX/pictureW)+((backGroundIX%pictureW==0)?0:1);//计算i左面有几幅图 for(int j=1;j<=n;j++){ canvas.drawBitmap( backgrounds[(i-j+length)%length], backGroundIX-pictureW*j, 0, paint ); } } //解决i自己 canvas.drawBitmap(backgrounds[i], backGroundIX, 0, paint); //解决i右侧的问题 if(backGroundIX<screenW-pictureW){ int k=screenW-(backGroundIX+pictureW); int n=(k/pictureW)+((k%pictureW==0)?0:1);//计算i右面有几幅图 for(int j=1;j<=n;j++){ canvas.drawBitmap( backgrounds[(i+j)%length], backGroundIX+pictureW*j, 0, paint ); } } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub screenW = getWidth(); screenH = getHeight(); //初始化图片 initPicture(); //启动刷帧线程 this.thread.setFlag(true); this.thread.start(); //启动滚屏线程 this.bgThread.setFlag(true); this.bgThread.start(); initPicture(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub boolean retry = true; this.thread.setFlag(false); this.bgThread.setFlag(false); while (retry) { try { thread.join(); bgThread.join(); retry = false; } catch (InterruptedException e) {//不断地循环,直到刷帧线程结束 } } } //刷阵线程 class TutoriolThread extends Thread{ private SurfaceHolder surfaceHolder; private GameView gameView; private boolean flag = false; public TutoriolThread(SurfaceHolder surfaceHolder, GameView gameView) {//构造器 this.surfaceHolder = surfaceHolder; this.gameView = gameView; } public void setFlag(boolean flag) {//设置循环标记位 this.flag = flag; } @Override public void run() { Canvas c; while (this.flag) { c = null; try { // 锁定整个画布,在内存要求比较高的情况下,建议参数不要为null c = this.surfaceHolder.lockCanvas(null); synchronized (this.surfaceHolder) { gameView.drawPicture(c);//绘制 //移动切图坐标,每次只移动一位 if(gameView.i == length) gameView.i = 0; else gameView.i++; } } finally { if (c != null) { //更新屏幕显示内容 this.surfaceHolder.unlockCanvasAndPost(c); } } try{ Thread.sleep(100); } catch(Exception e){ e.printStackTrace(); } } } }}
package com.example.scrollview;/** * @author Arthur Lee * @date 08/22/2014 * */public class BackGroundThread extends Thread{ private int sleepSpan = 500;//睡眠的毫秒数 private int span = 1;//图片移动的步长 private boolean flag = true;//循环标志位 GameView gameView;//GameView的引用 public BackGroundThread(GameView gameView){//构造器 this.gameView = gameView; } public void setFlag(boolean flag){//设置标记位 this.flag = flag; } public void run(){ while(flag){ gameView.backGroundIX -= span; if(gameView.backGroundIX <-gameView.pictureW){ gameView.backGroundIX+=gameView.pictureW; } }try{ Thread.sleep(sleepSpan);//睡眠 }catch(Exception e){//捕获异常 e.printStackTrace();//打印异常信息 } }}
0 0
- 学徒浅析Android开发:第十四讲——Frame动画的滚屏操作
- 学徒浅析Android开发:第六讲——屏幕分辨率自适应
- 学徒浅析Android开发:第十三讲——Tween动画
- 学徒浅析Android开发:第二讲——ListView和GridView的应用
- 学徒浅析Android开发:第三讲——Dilalog的常用方法介绍(一)
- 学徒浅析Android开发:第三讲——Dialog的常用方法介绍(二)
- 学徒浅析Android开发:第五讲——Handler和Intent的是传值流程
- 学徒浅析Android开发:第四讲——ImageView图片你的控制
- 学徒浅析Android开发:第十一讲——ListView嵌套问题的特解
- 学徒浅析Android开发——SO文件的混淆
- 学徒浅析Android开发——SO文件的混淆
- 学徒浅析Android开发:第七讲——数据存储之SharedPreferences
- 学徒浅析Android开发:第七讲——数据存储之SQLite
- 学徒浅析Android开发:第八讲——TabWidget标签制作
- 学徒浅析Android开发:第九讲——SpannableString,让文字活起来
- 学徒浅析Android开发:第十讲——文字剪切效果
- 学徒浅谈Android开发:第一讲——滑屏效果的实现ViewPager+Fragment
- 学徒浅析Android开发:杂谈——WebView的url跳转时方法执行顺序
- 卡塔兰数
- GPU编程之CUDA(十)——示例程序运行截图【7_CUDALibraries】
- 简单问题:VIM中 查找 “上一个” 的快捷键是什么?
- GPRS常识--AT指令
- ios7 结合storyborad实现页面跳转的总结
- 学徒浅析Android开发:第十四讲——Frame动画的滚屏操作
- Cocos2d-JS 官方文档
- Using storm-starter with Maven
- gfdsgsggsg
- gfdsgsggsg
- 多线程经典题目
- c++重要知识点总结
- Adnroid之TextView属性详解
- Python(2.7.x)调用Java的简单示例