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 webview 滚动不起作用

    我正在尝试在网络视图中向下滚动到页面底部 我正在使用谷歌在其教程中提供的网络视图示例 我正在使用这行代码来尝试滚动 但它不起作用 mWebView pageDown true 关于如何使其以编程方式滚动有什么建议吗 谢谢 public cl
  • FTS3 在 ORMLite 中搜索?

    我对 FTS3 一无所知 除了http developer android com guide topics search search dialog html http developer android com guide topics
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • 如何使用Android opencv使图像的白色部分透明

    我无法链接超过 2 个网址 因此我将我的照片发布到此博客 请在这里查看我的问题 http blog naver com mail1001 220650041897 http blog naver com mail1001 220650041
  • 带有一、二和三个按钮的 Android 警报对话框

    我不经常发出警报 但每次发出警报时 我都会花一些时间来阅读文档 https developer android com guide topics ui dialogs html并弄清楚如何去做 由于我现在不得不这样做几次 所以我将在下面写一
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • 从 React Native Js 代码调用 Android Native UI 组件方法

    我创建了一个 CustomView SignatureView java 它扩展了 LinearLayout 以捕获 Android Native 中的签名 并创建了SignatureCapturePackage java和Signatur
  • 如何为发布而不是调试创建密钥库?扑

    我按照使用此网站部署 flutter 的步骤进行操作https flutter io android release https flutter io android release 当我运行 flutter build apk 时出现此错
  • Android Library项目使用gradle在命令行编译时无法导入另一个库项目的R类

    我的 android 项目有这样的结构 ProjectDir settings gradle MyApp depends on LibraryA and LibraryB gt build gradle gt All the other a
  • 如何检查用户在EditText中输入自己的电话号码?

    用户将在我的 Android 应用程序的注册页面上的编辑文本中输入手机号码 如何检查用户输入的是他 她的手机号码而不是其他人的 我试过这个 TelephonyManager tMgr TelephonyManager mAppContext
  • 如何在TableLayout中创建三列

    我正在开发一个使用的屏幕TableLayout 在这里我可以轻松创建两列 但我怎样才能创建三列呢 这里有一个例子
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 使用 PhoneGap 使 Android 应用程序易于访问(对于残障人士)

    有人有过使用 PhoneGap 使 Android 应用程序可访问的经验吗 至少我们需要使我们的应用程序符合第 508 条规定 我尝试实现一些标准的辅助功能 文本框标签 向 div 添加标题属性等 但是 当在 Android 中使用 Tal
  • PhoneStateListener 不调用

    这是我的完整代码 广播示例 java package com example broadcast gt import android app Activity import gt android content Context import
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • 如何在android asynctask中使用inputstream作为参数?

    我正在制作一个 Android 应用程序来跟踪股票详细信息 我将通过 csv 雅虎财经 检索数据 据我所知 在android 4 0中 网络连接无法在主线程上完成 因此 我将使用 asynctask 来建立连接 但是 我在参数方面遇到了一些
  • Android 中循环事件的星期几和时间选择器

    我想创建一个控件 允许用户在我的 Android 活动中选择一周中的某一天 星期一 和一天中的某个时间 下午 1 00 找不到任何关于此的好帖子 好吧 我想我已经明白了 我只是不喜欢这个解决方案 因为我在一周中的某一天使用的微调器与时间选择
  • Android 中带有组的列表视图

    我有一个列表视图 每行都有一些日期和文本 我可以像 iPhone 中那样将这个 listView 分组 组之间有标题吗 在 android 中是否可能 请帮忙 即 我需要在 Listview 行之间有标题栏 以便如果我使用日期对其进行分组

随机推荐

  • 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