前面已经了解过SurfaceView了,今天这里就直接开始通过Canvas来实现绘图相关的东西,我这里主要就是通过实现一个游戏来完成Canvas的学习。

1.创建一个GameView的类并且继承SurfaceView。

Paste_Image.png

2.创建一个管理游戏背景的类DrawBackground

package com.tangyx.game.holder;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import com.tangyx.game.util.BitmapUtils;

import com.tangyx.game.util.ScreenUtils;

/**

* Created by tangyx on 2016/12/22.

*

*/

public class DrawBackground extends DrawGame {

private Bitmap mBackgroundTop;

private Bitmap mBackgroundBottom;

/**

* 因为背景是全屏的,并且飞机是一直在往上运动,所以X坐标不需要运动,只需要改变y的坐标来完成运动效果

*/

private float mTopY;

private float mBottomY;

/**

* 背景移动速度

*/

private float mSpeedBY=4;

public DrawBackground(Context context,String background){

super(context);

//加载背景图片

mBackgroundBottom = BitmapUtils.ReadBitMap(context,background);

//把背景图大小设置为手机屏幕大小

mBackgroundBottom = BitmapUtils.getBitmap(getContext(), mBackgroundBottom,0);

//把背景图在垂直翻转生成一张新的图片

mBackgroundTop = BitmapUtils.getScaleMap(mBackgroundBottom);

}

@Override

void initialize() {

mBottomY = 0;

/**

* 第一张背景放在屏幕的顶部外面

*/

mTopY = -ScreenUtils.getScreenHeight(getContext());

mSpeedBY=4;

}

@Override

void onDraw(Canvas canvas) {

//背景是一张图片,所以我们应该通过canvas的drawBitmap来实现,

// 景的图片其实一直是一张图片在由上至下运动,通过两张图片链接进行循环

canvas.drawBitmap(mBackgroundBottom,0, mBottomY,mPaint);

canvas.drawBitmap(mBackgroundTop,0, mTopY,mPaint);

}

@Override

void updateGame() {

mBottomY +=mSpeedBY;

mTopY +=mSpeedBY;

//当mBackgroundBottom已经移动出屏幕就自动设置到屏幕之外的最顶部。

if(mBottomY >= ScreenUtils.getScreenHeight(getContext())){

mBottomY = -ScreenUtils.getScreenHeight(getContext());

}

//mBackgroundTop已经移动出屏幕就自动设置到屏幕之外的最顶部。

if(mTopY >= ScreenUtils.getScreenHeight(getContext())){

mTopY = -ScreenUtils.getScreenHeight(getContext());

}

}

}

它继承了DrawGame,这是我自定义的一个抽象类,因为后面可能不会的内容都需要继承它来进行规范管理。

package com.tangyx.game.holder;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

/**

* Created by tangyx on 2016/12/22.

*

*/

public abstract class DrawGame {

private Context mContext;

protected Paint mPaint;

public DrawGame(Context context) {

this.mContext = context;

mPaint = new Paint();

mPaint.setColor(Color.WHITE);

initialize();

}

/**

* 初始化内容

*/

abstract void initialize();

/**

* 绘制内容

* @param canvas

*/

abstract void onDraw(Canvas canvas);

/**

* 数据更新

*/

abstract void updateGame();

public Context getContext() {

return mContext;

}

}

3.说一下游戏背景的实现的思路:

通过选择的场景在DrawBackground中加载得到一个图片的对象mBackgroundBottom,然后再通过getScaleMap得到mBackgroundBottom垂直翻转的新对象mBackgroundTop,getScaleMap在BitmapUtils工具类中。

初始化这两张图片的位置,整个屏幕的可见区域,肯定只能显示一张图片(mBackgroundBottom),那另一张呢(mBackgroundTop)?由于飞机的感觉是一直向上飞行的感觉,所以地图应该一直感觉在往下运动,我们就需要去改变两种图片在surface中Y的坐标实现动画效果,所以另一张图片就在屏幕顶部的最上方。

通过updateGame去增加Y的坐标,判断哪一张图片移动到屏幕之外了就立刻移动到屏幕最顶部的上方。通过这样的逻辑就能实现地图无限循环。

在GameView中使用

Paste_Image.png

Paste_Image.png

Paste_Image.png

background.gif

最后附上源码

再次重复一下,学习Canvas有一定的过程,源码是通过git持续更新,如果有什么不太明白,你可以查看前面的文章。

下一节将会讲解主角的逻辑以及手势控制,如果你也喜欢就一起来学习吧。

学习是生活的一种态度

上一篇 下一篇

android 飞机动画,Android Canvas打飞机之让背景动起来相关推荐

  1. android碰撞动画,Android实战打飞机游戏之子弹生成与碰撞以及爆炸效果(5)

    Android实战打飞机游戏子弹生成,新建子弹类 public class Bullet { // 子弹图片资源 public Bitmap bmpBullet; // 子弹的坐标 public in ...

  2. android 飞机动画,Android实现纸飞机的简单操作

    在项目中,我们要求做一个纸飞机的功能:就是当打开这个界面时,会有4架纸飞机从屏幕左侧飞入,然后到达自己的位置坐上下浮动,同时云彩也不断地从屏幕右侧飘到屏幕左侧.当你点击其中一个纸飞机时,这个纸飞机先向 ...

  3. android弹球动画,Android动画之自定义Evaluator实现弹球效果

    前言 今天给大家带来的是自定义Evaluator实现弹球效果,我们先给大家来个效果图. 下面我们介绍具体代码流程 1. 自定义Point类 public class Point { private i ...

  4. android 逐字动画,Android实现文本逐字显示View(类似rpg游戏人物对话,文本逐字显示)...

    前面好多篇文章都是Android Studio.源码编译.ndk等相关教程,今天敲一敲代码,不然都生锈了哈_. 来个古装动画美图,缓解大家疲劳的眼睛...(话说有木有人知道这是谁???) Paste_ ...

  5. android 海浪动画,android自定义波浪加载动画的实现代码

    本文实例为大家分享了android自定义波浪加载动画的具体代码,供大家参考,具体内容如下 效果图 1.自定义控件 WaveView package com.example.wh.myapplicati ...

  6. android菊花动画,Android实现仿iOS菊花加载圈动画效果

    常见的实现方式 切图,做旋转动画 自定义View,绘制效果 gif图 1.切图会增加体积,但相对简单,不过在换肤的场景下,会使用不同颜色,需要准备多张图,不够灵活. 2.由于自定义的好处,不同颜色只需 ...

  7. android jason动画,Android 动画之Lottie动画使用

    Android 动画之Lottie动画使用 一:简介 Lottie是Airbnb开源的一套跨平台的完整解决方案,设计师只需要使用After Effects(简称AE)设计动画之后,使用Lottic提供 ...

  8. android decorview动画,Android窗口机制(二)Window,PhoneWindow,DecorView,setContentView源码理解...

    Android窗口机制系列 前篇文章中出现了PhoneWindow,DecorView这些类,如果是第一次见过的话,肯定会觉得陌生.这篇文章主要跟大家讲解Window,PhoneWindow,Deco ...

  9. android 减速动画,Android View Animation

    概述 可译为视图动画,分为 缩放动画 平移动画 渐变动画 旋转动画 Android系统中定义了一个抽象类Animation来定义这种视图动画,它的具体子类如下表: 动画名称 对应的子类 xml中标签 ...

  10. android 底部动画,Android实现360手机助手底部的动画菜单

    首先来看下我们实现的效果和360效果的对比: 360手机助手效果演示 本库实现的效果(Icon来自360手机助手,侵删) xml布局文件 注:为了美观,讲每个Button的高度以及固定,设置wrap_ ...

最新文章

  1. 扎克伯格|在美国国会数据门听证会上的证词-中英文全文
  2. tensorflow 入门
  3. Hadoop命令学习
  4. java boolean例子_Java Field setBoolean()用法及代码示例
  5. laravel8找不到控制器_找一个“靠谱儿”的烟雾探测器方案,难不难?
  6. java洗扑克牌算法分析_IT兄弟连 Java语法教程 综合案例
  7. PHP基础PPT课件,《php基础》PPT课件.ppt
  8. php strict_types
  9. 嵌入式系统那些事-一张图秒懂系统启动流程
  10. python3.5 爬取bing搜索结果页面标题、链接
  11. 全球首个5G R16 Ready:紫光展锐的新征程
  12. vue 中provide的用法_vue高阶用法之provide与inject
  13. 经典神经网络模型整理
  14. openCV+python实现倾斜校正
  15. 批处理系统、分时系统和实时系统各有什么特点?你能简单的分析下各操作系统采用了哪些设计思路来实现这些特点呢?
  16. 技术岗的职业规划_《阿里感悟》- 技术人员的职业规划
  17. 运筹系列56:python空间分析库pysal.spaghtti
  18. IT选型指南:餐饮连锁企业的信息化之道
  19. 使用Matlab求解连续时间系统的零状态响应
  20. Python Selenium之等待元素小案例(用于某网站自动打开领取QQ名片赞)--文末有附selenium知识点以及对应学习文档网址

热门文章

  1. 图书馆管理系统(C语言课程设计)
  2. 第一次在公司用git克隆项目办法
  3. 校园论坛网站设计设计与实现
  4. 课程设计2:交通灯仿真设计
  5. 概率论:数字特征与极限定理——方差与标准差
  6. iOS 判断设备是否越狱(两种方式结合判断)
  7. 2022-2028全球与中国平板显示器制造设备市场现状及未来发展趋势
  8. QQ2009、QQ2010、QQ2011远程攻击漏洞,详细使用方法。
  9. 【JavaScript】函数应用
  10. 交通银行计算机岗位薪资,交通银行员工年终奖