首先声明,该效果并不是用动画实现的,而是用自定义View实现的,在onDraw方法里面调用invalidate()函数,实现气泡上升效果
    气泡类:
  1. private class Bubble {
  2.                 /** 气泡半径 */
  3.                 private int radius;
  4.                 /** 上升速度 */
  5.                 private float speedY;
  6.                 /** 平移速度 */
  7.                 private float speedX;
  8.                 /** 气泡x坐标 */
  9.                 private float x;
  10.                 /** 气泡y坐标 */
  11.                 private float y;
  12. }
复制代码     另起线程生成气泡:
  1. if (!starting) {
  2.                         starting = true;
  3.                         new Thread() {
  4.                                 public void run() {
  5.                                         while (true) {
  6.                                                 try {
  7.                                                         Thread.sleep(random.nextInt(3) * 300);
  8.                                                 } catch (InterruptedException e) {
  9.                                                         // TODO Auto-generated catch block
  10.                                                         e.printStackTrace();
  11.                                                 }
  12.                                                 Bubble bubble = new Bubble();
  13.                                                 int radius = random.nextInt(30);
  14.                                                 while (radius == 0) {
  15.                                                         radius = random.nextInt(30);
  16.                                                 }
  17.                                                 float speedY = random.nextFloat()*5;
  18.                                                 while (speedY < 1) {
  19.                                                         speedY = random.nextFloat()*5;
  20.                                                 }
  21.                                                 bubble.setRadius(radius);
  22.                                                 bubble.setSpeedY(speedY);
  23.                                                 bubble.setX(width / 2);
  24.                                                 bubble.setY(height);
  25.                                                 float speedX = random.nextFloat()-0.5f;
  26.                                                 while (speedX == 0) {
  27.                                                         speedX = random.nextFloat()-0.5f;
  28.                                                 }
  29.                                                 bubble.setSpeedX(speedX*2);
  30.                                                 bubbles.add(bubble);
  31.                                         }
  32.                                 };
  33.                         }.start();
  34.                 }
复制代码    绘制渐变背景和气泡:
  1. Paint paint = new Paint();
  2.                 // 绘制渐变正方形
  3.                 Shader shader = new LinearGradient(0, 0, 0, height, new int[] {
  4.                                 getResources().getColor(R.color.blue_bright),
  5.                                 getResources().getColor(R.color.blue_light),
  6.                                 getResources().getColor(R.color.blue_dark) },
  7.                                 null, Shader.TileMode.REPEAT);
  8.                 paint.setShader(shader);
  9.                 canvas.drawRect(0, 0, width, height, paint);
  10.                 paint.reset();
  11.                 paint.setColor(Color.WHITE);
  12.                 paint.setAlpha(200);
  13.                 List list = new ArrayList(bubbles);
  14.                 for (Bubble bubble : list) {
  15.                         if (bubble.getY() - bubble.getSpeedY() <= 0) {
  16.                                 bubbles.remove(bubble);
  17.                         } else {
  18.                                 int i = bubbles.indexOf(bubble);
  19.                                 if (bubble.getX() + bubble.getSpeedX() <= bubble.getRadius()) {
  20.                                         bubble.setX(bubble.getRadius());
  21.                                 } else if (bubble.getX() + bubble.getSpeedX() >= width
  22.                                                 - bubble.getRadius()) {
  23.                                         bubble.setX(width - bubble.getRadius());
  24.                                 } else {
  25.                                         bubble.setX(bubble.getX() + bubble.getSpeedX());
  26.                                 }
  27.                                 bubble.setY(bubble.getY() - bubble.getSpeedY());
  28.                                 bubbles.set(i, bubble);
  29.                                 canvas.drawCircle(bubble.getX(), bubble.getY(),
  30.                                                 bubble.getRadius(), paint);
  31.                         }
  32.                 }
复制代码

解决了36楼问题:楼主 ,跑了下DEMO,  屏幕关闭后线程还在跑,但是CANVAS不刷新了,重新亮屏后所有的气泡挤在一起,时间一长会OOM吧
本主题由 e小七 于 2015-3-13 09:50 设置高亮
*滑动验证: 按住左边滑块,拖动完成上方拼图

BubbleLayout.gif (1.16 MB, 下载次数: 149)

BubbleLayout_1.rar

1.38 MB, 下载次数: 753

更多相关文章

  1. Android(安卓)OpenGL探索之纯色背景绘制
  2. 批量复制IE临时文件(Temporary Internet Files)
  3. 动画---放缩,旋转,移动,渐变
  4. android之自定义渐变颜色(一)
  5. Android(安卓)Shape(背景渐变颜色)
  6. 深入理解 Android(安卓)消息机制原理
  7. Android(安卓)Q私有目录与公共目录文件的交互(读取,复制,保存等)——
  8. android 数据库创建在SD(TF)卡中
  9. 完美解决 Android(安卓)studio 检测不到 genymotion模拟器设备!!

随机推荐

  1. Android官方架构组件Paging:分页库的设计
  2. Android(安卓)BroadcastReceiver(广播)实
  3. 一些优秀的 Android(安卓)开发专栏推荐
  4. 详述Google针对Android平板App发布的十大
  5. 内存泄漏,关于异步回调导致的内存泄漏,使用
  6. 让Android自带的Gallery实现多点缩放,拖动
  7. Google:所有含 Android(安卓)Market 的 An
  8. android 使用handler更新ui,使用与原理分
  9. Android(安卓)之 Window、WindowManager
  10. Android中AsyncTask的简单用法