【移动开发】在Canvas上显示动画
来源:互联网 发布:软件开发团队协作 编辑:程序博客网 时间:2024/04/30 13:14
本文翻译自《50 android hacks》
当自定义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 int getX() { return mCoordX; } public void setY(int newValue) { mCoordY = newValue; } public int 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); } @Override protected void onDraw(Canvas canvas) { invalidate(); mRectangle.move(); mRectangle.onDraw(canvas); }}
主界面。
获取屏幕的尺寸,并把相应的尺寸赋值给DrawView对象。最后,显示DrawView对象。代码如下:
public class MainActivity extends Activity { private DrawView mDrawView; @Override public 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); }}
参考资料
http://developer.android.com/reference/android/graphics/Canvas.html
http://developer.android.com/guide/topics/graphics/2d-graphics.html
0 0
- 【移动开发】在Canvas上显示动画
- 在Canvas上显示动画
- 在 Canvas 上显示动画
- android 开发技巧(6)--在 Canvas 上显示动画
- 7、在Canvas上显示动画
- Hack7-在Canvas上绘制动画效果
- J2ME在移动设备上实现动画
- 50 Android Hacks Hack7 在canvas上绘制动画
- 在网页上显示漂浮移动效果
- 关于在eclipse开发web时鼠标移动到图片上显示文字问题
- 如何读取xaml并显示在Canvas上
- Canvas使用drawImage()函数在画布上显示图像
- <canvas>学习笔记——如何在<canvas>上显示图片
- 用J2ME在移动设备上实现动画
- 用J2ME在移动设备上实现动画
- 用J2ME在移动设备上实现动画
- 用J2ME在移动设备上实现动画
- 用J2ME在移动设备上实现动画
- 树莓派用户管理
- 【 线段树 】(结构体型)模板
- 《反欺骗的艺术》读后感
- patch修改
- android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context r
- 【移动开发】在Canvas上显示动画
- 线性回归 Linear Regression, 逻辑回归 Logistic Regression 小结
- Problem I: 俊爷的局域网
- Codeforces Round #265 (div2) A. inc ARG
- 【OC学习-26】对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝
- Runtime Error的几种情况
- stack与queue用法及它们的几层含义
- vshield manager的一些笔记
- jQuery经典面试题及答案精选