当自定义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);
} }

源码下载:

最新文章

  1. IO(五)----打印流
  2. oracle补丁升级
  3. C#导出Excel那些事
  4. 读书笔记_Effective_C++_条款四十四:将与参数无关的代码抽离template
  5. ibatis cannot find &lt;sql&gt; pattern
  6. 用java 删除mongodb的数据
  7. codeforces Winner
  8. POJ 1503 Integer Inquiry 简单大数相加
  9. Android Camera 流程梳理
  10. 分享一个用安卓手机就能引导pc安装linux系统办法
  11. EasyUI之Hello world(EasyUI的入门学习)
  12. 201521123030 《Java程序设计》 第11周学习总结
  13. mybatis实战教程二:多对一关联查询(一对多)
  14. 改变选择文字的color及background-color
  15. 【缓存算法】FIFO,LFU,LRU
  16. mysql主从复制延迟问题的相关知识与解决方案
  17. Rocketmq源码导入eclipse时报错的解决方法
  18. Linux之更改Nginx映射默认根目录
  19. hive介绍、安装配置、表操作基础知识适合小白学习
  20. Golint的简易使用方法

热门文章

  1. Spring 循环依赖
  2. 1125 Chain the Ropes
  3. 微信小程序之如何使用iconfont
  4. Py修行路 python基础 (二十五)线程与进程
  5. python&#39;s twenty-first day for me 抽象类和接口类以及多态
  6. java成神之——HttpURLConnection访问api
  7. 关于Pycharm中如何注释
  8. Linux 学习笔记之 --- select 与 poll 事件模型详解
  9. 生成ssl脚本文件
  10. 不要向没权力&amp;能力的人证明自己的能力