android 开发技巧(6)--在 Canvas 上显示动画

2023-11-01

Android 中的Canvas 可以在屏幕上绘图,定义是这样的:

“可以把 Canvas 视为 Surface 的替身或者接口,图形便是绘制
在 Surface 上的。 Canvas 封装了所有绘图调用。通过 Canvas,绘制
到 Surface 上的内容首先存储到与之关联的 Bitmap 中,该 Bitmap
最终会呈现到窗口上。”

Canvas 类封装了所有绘图调用,可以创建一个 View(视图),重写其 onDraw() 方法,在该方法中便可以绘制基本的图形单元

效果图
这里写图片描述
步骤
首先创建一个方块类

public class Rectangle extends View {
  public static final int MAX_SIZE = 140;
  private static final int ALPHA = 255;
  private int mCoordX = 0;
  private int mCoordY = 0;
  private int mRealSize = 140;
  private int mSpeedX = 3;
  private int mSpeedY = 3;

  private boolean goRight = true;
  private boolean goDown = true;
  private DrawView mDrawView;

  private Paint mInnerPaint;
  private RectF mDrawRect;

  public Rectangle(Context context, DrawView drawView) {
    super(context);
    mDrawView = drawView;

    mInnerPaint = new Paint();

    mDrawRect = new RectF();

    /* Red is default */
    mInnerPaint.setARGB(ALPHA, 255, 0, 0);
    mInnerPaint.setAntiAlias(true);
  }

  public void setARGB(int a, int r, int g, int b) {
    mInnerPaint.setARGB(a, r, g, b);
  }

  public void setX(int newValue) {
    mCoordX = newValue;
  }

  public float getX() {
    return mCoordX;
  }

  public void setY(int newValue) {
    mCoordY = newValue;
  }

  public float getY() {
    return mCoordY;
  }

  public void move() {
    moveTo(mSpeedX, mSpeedY);
  }

  private void moveTo(int goX, int goY) {

    // check the borders, and set the direction if a border has reached
    if (mCoordX > (mDrawView.width - MAX_SIZE)) {
      goRight = false;
    }

    if (mCoordX < 0) {
      goRight = true;
    }

    if (mCoordY > (mDrawView.height - MAX_SIZE)) {
      goDown = false;
    }
    if (mCoordY < 0) {
      goDown = true;
    }

    // move the x and y
    if (goRight) {
      mCoordX += goX;
    } else {
      mCoordX -= goX;
    }
    if (goDown) {
      mCoordY += goY;
    } else {
      mCoordY -= goY;
    }

  }

  public int getSpeedX() {
    return mSpeedX;
  }

  public void setSpeedX(int speedX) {
    mSpeedX = speedX;
  }

  public int getmSpeedY() {
    return mSpeedY;
  }

  public void setSpeedY(int speedY) {
    mSpeedY = speedY;
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    mDrawRect.set(mCoordX, mCoordY, mCoordX + mRealSize, mCoordY
        + mRealSize);
    canvas.drawRoundRect(mDrawRect, 0, 0, mInnerPaint);

  }

  public void setSize(int newSize) {
    mRealSize = newSize;
  }

  public int getSize() {
    return mRealSize;
  }
}

在主界面显示的内容视图

public class DrawView extends View {
  private Rectangle mRectangle;
  public int width;
  public int height;

  public DrawView(Context context) {
    super(context);
    //创建方块对象
    mRectangle = new Rectangle(context, this);
    mRectangle.setARGB(255, 255, 0, 0);
    mRectangle.setSpeedX(10);
    mRectangle.setSpeedY(10);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    invalidate();//重绘View

    mRectangle.move();//变换方块位置
    mRectangle.onDraw(canvas);//将方块绘制到Canvas上
  }

}

主界面

public class Hack07Activity extends Activity {
    private DrawView mDrawView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Display display = getWindowManager().getDefaultDisplay();//获取屏幕的宽和高
        mDrawView = new DrawView(this);
        mDrawView.height = display.getHeight();
        mDrawView.width = display.getWidth();

        setContentView(mDrawView);
    }
}

一点说明:invalidate() 方法本身就是一个小技巧,这个方法强制重绘视图。把这个方法放在 onDraw() 的目的是为了在 View 绘制完自身后,可以立即重新调用 onDraw() 方法。换句话说,通过循环调用Rectangle 的 move() 和 onDraw() 方法实现一个动画效果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 开发技巧(6)--在 Canvas 上显示动画 的相关文章

  • 如何为整个 Android 应用程序设置默认字体系列

    我在我的应用程序中使用 Roboto 浅色字体 要设置字体 我必须添加android fontFamily sans serif light 到每一个视图 有没有办法将 Roboto 字体声明为整个应用程序的默认字体系列 我已经尝试过这样的
  • 是否可以禁止 EditText 中的第一个数字为“0”

    您好 我只是想知道是否可以禁止用户输入的第一个数字为 0
  • 选项 多个活动通用的菜单项

    安卓系统设计指南 http developer android com design patterns help html表示 帮助 应始终放置为溢出菜单的最后一项 它不应该出现在 ActionBar 中 而且 它应该出现在每个活动中 以便
  • Android 版 YouTube 频道订阅

    我在我的应用程序中使用 YouTube API 用户可以使用其 Google 帐户登录 我希望用户能够订阅某些 YouTube 频道 这里似乎有一些关于网络的东西 https developers google com youtube su
  • Android Volley 服务器错误

    I am posting data all strings to varchar variables in server but i am getting volley server error or badnetwork performa
  • 如何使用baseadapter自定义listview

    我想创建一个定制的ListView像这样 我想我必须使用BaseAdapter但我对此一无所知 主要 xml
  • 如何在ionic框架+ angularjs中调用函数?

    我正在使用 ionic 框架来制作 android 应用程序 我有 cordova5 1版本 first 我使用命令行创建一个项目ionic 启动 myApp 选项卡 我添加了android平台 现在我需要将java代码与javascrip
  • cordova:从 url 下载到 android 下载文件夹

    在开始之前 我尝试了以下堆栈溢出的答案 使用phonegap将文件下载到ios android下载文件夹 https stackoverflow com questions 21375624 download file to downloa
  • Android 设备上的 Facebook 分享问题

    我使用了来自的样本AndroidFacebook示例 https github com ddewaele AndroidFacebookSample它在模拟器上运行良好 但在设备上它被转移到内置的 Facebook 意图 设备上不会出现身份
  • Android:我需要关闭 Cursor 对象吗?

    在我的数据库适配器类中 我有很多这样的方法 public long getContactId final String phoneNumber throws SQLException final Cursor cur mDb rawQuer
  • ScrollView 中的 ViewPager 不会垂直滚动

    我有一个layout有一个ViewPager自定义内部ScrollView并且 ViewPager 不会垂直滚动 自定义 ScrollView 用于修复使用 ScrollView 进行可怕的选项卡滑动的问题 是的 有足够的内容可以滚动 我已
  • 将图像缩略图上传到服务器,而不上传整个图像

    据我所知 我在这里问的是不可能的 但我想无论如何我都会问 以防我遗漏了什么 假设您想让用户上传 JPG 图像 并且这些图像被缩放为较小的图标 并且原始图像始终被丢弃并且不再需要 有没有什么方法可以在大多数现代浏览器中普遍使用 让用户选择硬盘
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript
  • Android NDK 模块依赖于另一个模块

    我有一个使用 Android NDK 编写的 Android 项目 在该项目中 我使用两个预构建的共享库 GpkgSDK 和 Spatialite 并构建另外两个共享库 WFSHelpers 和 com example gpkgviewer
  • Facebook 和 google 登录不适用于 beta 测试 APK

    Google 和 Facebook 登录在 Android Studio Tools 中工作正常 但它们不适用于测试版本或 Beta 测试 因此请给我任何解决此问题的线索 联系谷歌支持后我已经解决了这个问题 以下是此问题的修复方法 请按照步
  • listItems之间的黑线,如何删除?

    我的列表项之间有一些水平黑线 如何删除它们 我的图形没有一部分 谢谢 listview setDivider null listview setDividerHeight 0 或在 XML 中
  • 如何检测屏幕何时关闭?

    是否可以检测屏幕何时关闭并捕获它 我想在 Android 的全局设置中将计时器设置为 15 秒 我正在尝试查找一些如何捕获唤醒锁定模式的信息 只需注册您的应用程序即可执行操作Intent ACTION SCREEN OFF https de
  • Maven:如何获取捆绑在包中的 .so 库

    我有一个带有 jar 和 so 文件的第三方库 我配置了 pom xml 如下
  • Handler、MessageQueue、Looper,它们都是运行在UI线程上的吗?

    我正在尝试解决线程问题 并且我知道我可能会使用Handler将消息 可运行对象发布到MessageQueue 这又被Looper并发送回Handler进行加工 如果我发帖到Handler在我的活动中 是Activity Handler Me
  • 有没有在android中使用roboguice和fragment的简单例子?

    我在寻找使用 Fragments RoboGuice 的工作示例时遇到问题 当您尝试使用 Android 片段事务管理器添加 删除片段时会出现此问题 一旦您告诉片段从 RoboFragment 继承 事务管理器就不再认为该类是片段 因为它扩

随机推荐

  • Python的frame 是什么

    栈帧 frame 栈帧表示程序运行时函数调用栈中的某一帧 想要获得某个函数相关的栈帧 则必须在调用这个函数且这个函数尚未返回时获取 可以使用sys模块的 getframe 函数 或inspect模块的currentframe 函数获取当前栈
  • 统计文件中字符的个数

    编写一个函数int charnum char fn 10 该函数以只读方式打开文件fn 通过统计 返回文件中字符的个数 请使用while循环实现计数功能 注意 1 部分源程序已存在文件中 2 请勿修改主函数main和其他函数中的任何内容 仅
  • maya阿诺德渲染失败_maya2018无法加载ARNOLD渲染器?maya2018中ARNOLD渲染器加载不了怎么办?...

    maya2018无法加载ARNOLD渲染器可通过以下方法解决 1 首先右键点击我的电脑并选择属性 2 然后点击高级系统设置 打开系统属性面板 3 打开系统属性面板之后在高级选项卡下点击环境变量 4 接着在用户变量中新建一个变量 如果已经存在
  • Qt多进程开发

    一 概述 随着客户端不断增加UI页面 运行程序的 体积 越来越大 初始化这些页面的时间也越来越长 1 单个进程架构的 瓶颈 在正式介绍Qt多进程架构开发前 先看看单个进程架构下客户端开发所遇到的 瓶颈 在单个进程的架构中 为了避免初始化某个
  • Python报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte

    Python报错UnicodeDecodeError gbk codec can t decode byte 这个错误是做NLP的小伙伴常见的一个错误 报错原因是读取的文件中有中文 核心思路 将 with open file as f 改成
  • 模型集成

    集成学习 ensemble learning 是机器学习中一类学习算法 值训练多个学习器并将它们组合起来使用的方法 这类算法通常在实践中会取得比单个学习器更好的预测结果 基于数据的集成 在训练阶段的数据扩充在测试阶段仍然适用 诸如图像多尺度
  • Linux find指令过滤掉没有查看权限的文件

    find 路径 name 文件名 2 gt dev null
  • 循环神经网络(RNN)实现股票预测

    活动地址 CSDN21天学习挑战赛 前言 1 什么是循环神经网络 一个最简单的循环神经网络如下图所示 这样的神经网络一共有3层 分别是输入层x 隐藏层h和输出层y 定义每一层的节点下标如下 k表示的是输出层的节点下标 j表示的是当前时间节点
  • HTML meta viewport属性说明(mark)

    点击打开原文 什么是Viewport 手机浏览器是把页面放在一个虚拟的 窗口 viewport 中 通常这个虚拟的 窗口 viewport 比屏幕宽 这样就不用把每个网页挤到很小的窗口中 这样会破坏没有针对手机浏览器优化的网页的布局 用户可
  • 【Linux C编程】学生信息管理系统--简易版

    学生信息管理系统 流程图 一 定义一个枚举体做菜单目录 二 定义两个结构体 三 定义一个菜单函数 四 添加 删除 修改 搜索 排序相关代码 五 主函数 完整代码 总结 此学生管理系统是本人用Linux系统下vim编辑器编写的 该学生管理系统
  • 树莓派使用 OLED 屏显示图片及文字

    树莓派默认是不带显示屏的 如果想要查看系统的一些信息 需要使用电脑登录到树莓派 或者通过 HDMI 连接外接显示器查看 这样做总是有点麻烦 我们可以通过外接一个 OLED 屏来显示一些关键参数或者图片 本文将详细介绍操作方法 OLED 模组
  • BES平台(恒玄) ANC调试笔记

    一 前言 最近比较忙 昨天更新了EQ 调试模块 今天就趁热打铁把ANC部分也写下 主要说一些基于恒玄平台2500的ANC 环境搭配 软件设置 和 常见问题分析 个人见解 有不足之处 敬请锤教 二 环境搭配 此处引用BES 原厂ANC调试指南
  • 算力的计算公式

    算力 Computing Power 的计算公式可以根据不同情况而变化 以下是几种常见的计算算力的公式 FLOPS Floating Point Operations per Second 在浮点运算的场景下 算力可以使用FLOPS来衡量
  • chrome浏览器美化插件:让您的浏览器页面冒水泡, 游小鱼儿

    下载插件和效果图 这是一个让你的浏览器冒泡泡的插件 浏览网页的时候仿佛置身于海底世界 插件下载地址 http files cnblogs com files diligenceday chromeExtension crx zip 效果图
  • Hystrix中线程上下文ThreadLocal

    ThreadLocal 在Java编程语言里ThreadLocal是用来方便开发人员在同一线程上下文中不同类 不同方法中共享信息的 ThreadLocal变量不受其他线程的影响 不同线程间相互隔离 也就是线程安全的 在实际的业务链路中从入口
  • 【考研经验】2019双非逆袭哈尔滨工业大学计算机经验分享

    转载于 王道论坛 原作者 南桥几经秋 20的学弟学妹们 我是2019哈工大深圳的双非小菜鸡 初试407 74 61 135 137 大家都知道是谁了吧 初试考的还行但是复试被虐的真的惨 还好初试分高稳住占了个哈深名额 所以劝双非的学弟学妹们
  • python常见图形代码可视化大全整理(包括动图)

    目录 一 离散型变量的可视化 1 饼图 1 1 matplotlib模块 1 2 panda模块 1 3 字母符合饼图 2 条形图 2 1 matplotlib模块 2 1 1 垂直或水平条形图 2 1 2 堆叠条形图 2 1 3 水平交错
  • 学习cocos2d-x之路(11)--JumpTo和JumpBy

    CCJumpTo和CCJumpBy属于延时动作 即经过一段时间才能完成的动作 CCJumpTo 把某一CCSprite跳到某一位置 CCJumpBy 把某一CCSprite跳起一段距离 它有一个方法reverse 它让对象按原路径返回 创建
  • 5. Spring Boot Security资源管理持久化的实现

    1 概述 本次给大家讲一下如何实现资源的持久化 2 表机构以及数据 insert into sys user demo user id user name user passwd values 1 admin admin insert in
  • android 开发技巧(6)--在 Canvas 上显示动画

    Android 中的Canvas 可以在屏幕上绘图 定义是这样的 可以把 Canvas 视为 Surface 的替身或者接口 图形便是绘制 在 Surface 上的 Canvas 封装了所有绘图调用 通过 Canvas 绘制 到 Surfa