HackSeven Canvas上的动画
当自定义View的时候,可以利用Canvas给View添加一些动画效果。
下面的例子,是在屏幕上绘制一个红色的小方块,这个小方块会在屏幕上面“乱跳”。
知识点
使用到的知识点:
(1) 在View的子类的draw()中调用invalidate(),可以让View对象一直保持重绘状态,从而可以使Canvas一直处于绘画过程中。
(2) Canvas的绘制功能,例如绘制Rect、Circle、Path等。
(3) 小方块碰撞屏幕边缘的算法。
实现
小方块视图。
继承View类,重写onDraw()方法,并提供一些setter和getter方法,用于设置小方块的属性。判断碰撞事件的逻辑在moveTo()方法中。代码如下:
- public class Rectangle extends View {
- public static final int MAX_SIZE = 40;
- private static final int ALPHA = 255;
- private int mCoordX = 0;
- private int mCoordY = 0;
- private int mRealSize = 40;
- 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;
- }
- }
外层视图。
小方块是一个独立的视图,这里不直接把小方块显示在Actiity中,在它的外面又“包”了一层。代码如下:
- 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(3);
- mRectangle.setSpeedY(3);
- }
- @SuppressLint("WrongCall")
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- invalidate();
- mRectangle.move();
- mRectangle.onDraw(canvas);
- }
- }
主界面。
获取屏幕的尺寸,并把相应的尺寸赋值给DrawView对象。最后,显示DrawView对象。代码如下:
- public class MainActivity 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);
- }
- }
HackSeven Canvas上的动画的更多相关文章
- HTML5 Canvas核心技术图形动画与游戏开发(读书笔记)----第一章,基础知识
一,canvas元素 1 为了防止浏览器不支持canvas元素,我们设置“后备内容”(fallback content),下面紫色的字即为后备内容 <canvas id="canvas ...
- >炫酷的计时器效果Canvas绘图与动画<
>炫丽的计时器效果Canvas绘图与动画< 虽然我是学习java的,但是因为最近使用html5的关系,多学习了一下前端知识. 现在,我要介绍的计时器是十分炫酷的,使用画布完成. 喜欢htm ...
- Android中使用SurfaceView和Canvas来绘制动画
事实上每一个View中都有Canvas能够用来绘制动画.仅仅须要在这个View中重载onDraw()方法就能够,可是SurfaceView类是一个专门用来制动动画的类. Canvas(中文叫做&quo ...
- HTML5 Canvas水波纹动画特效
HTML5的Canvas特性非常实用,我们不仅可以在Canvas画布上绘制各种图形,也可以制作绚丽的动画,比如这次介绍的水波纹动画特效.以前我们也分享过一款基于HTML5 WebGL的水波荡漾动画,让 ...
- 7个华丽的基于Canvas的HTML5动画
说起HTML5,可能让你印象更深的是其基于Canvas的动画特效,虽然Canvas在HTML5中的应用并不全都是动画制作,但其动画效果确实让人震惊.本文收集了7个最让人难忘的HTML5 Canvas动 ...
- 用HTML和CSS实现WWDC 2015上的动画效果
用HTML和CSS实现WWDC 2015上的动画效果 动画效果WWDC 2015 原文:https://cssanimation.rocks/wwdc15/ 译者:周晓楷(@Helkyle) 每年 ...
- 【自己给自己题目做】:如何在Canvas上实现魔方效果
最终demo -> 3d魔方 体验方法: 浮动鼠标找到合适的位置,按空格键暂停 选择要翻转的3*3模块,找到相邻两个正方体,鼠标点击第一个正方体,并且一直保持鼠标按下的状态直到移到第二个正方体后 ...
- Canvas上绘制几何图形
重要的类自定义View组件要重写View组件的onDraw(Canvase)方法,接下来是在该 Canvas上绘制大量的几何图形,点.直线.弧.圆.椭圆.文字.矩形.多边形.曲线.圆角矩形,等各种形状 ...
- 使用JavaScript在Canvas上画出一片星空
随着Html5的迅猛发展,画布也变得越来越重要.下面我就写一个关于在canvas上画出一片星空的简单的代码的示例. 理论基础 初始化一个canvas,获得一个用于绘制图形的上下文环境context.并 ...
随机推荐
- MVC 控制器之间传值学习——session
刚接触MVC不久,写的一些代码自己都不忍心看下去.路漫漫其修远兮,宝宝还需努力!之前只用过Session做登录时用户信息的储存,今天对集合类数据做了小小的尝试:利用session在控制器之间传值,以减 ...
- SERDES高速系统(二)
抖动.容忍度与功耗 前面我提到SERDES的最终性能要用传输速率和传输距离考核.使用眼图可以形象化地衡量SERDES的收发性能,但是更为精确的参数化衡量手段是抖动(Jitter).容忍度(Tolera ...
- (转)IE=EmulateIE7 标签的作用
本文转载自:http://www.cnblogs.com/0000/archive/2009/11/01/1593851.html 对于 Web 开发人员来说,文本兼容性是一个要考虑的重要问题.Win ...
- java图形用户界面练习。j2se
总结:主要是如何布局.还是存在很大问题 package clientFrame; import java.awt.FlowLayout; import javax.swing.JButton; imp ...
- PHP文件操作(三)-文件的写入
fwrite() //对文件进行写入 fwrite(file,string,length)file:必选项,需要写入的文件string:必选项,规定要写入文件的字符串length:可选项,规定要写入 ...
- .gitignore non-valiate
Git忽略规则及.gitignore规则不生效的解决办法 分享到:更多19 2015-02-12 分类:Share2人评论65,215 次人浏览 在git中如果想忽略掉某个文件,不让这个文件提交 ...
- leetcode728
vector<int> selfDividingNumbers(int left, int right) { vector<int> V; for (int i = left; ...
- 「小程序JAVA实战」 小程序手写属于自己的第一个demo(六)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-06/ 自己尝试的写一个小demo,用到自定义样式,自定义底部导航,页面之间的跳转等小功能.官方文档 ...
- Tornado 高并发源码分析之一---启动一个web服务
前言: 启动一个tornado 服务器基本代码 class HomeHandler(tornado.web.RequestHandler): #创建 RequesHandler 对象,处理接收到的 h ...
- ffmpeg-URL(转)
ffmpeg中为方便对资源进行访问,定义了两个结构体,URLContext中是对具体资源文件进行操作的上下文,URLProtocol则是在将资源进行分类的基础上,对某一类资源操作的函数集,熟悉Linu ...