高仿QQ的手机管家的小火箭加速

1、前言

腾讯的手机管家,用过这个App的人都应该知道桌面的火箭一键加速这个功能,研究一下这个小火箭是怎么做出来的。先来了解一下小火箭有神马动作,首先在没有触碰它时,就是一个电源的显示或是一个图标依附在屏幕的两侧,点击变成小火箭,可以跟随拖动,当没有放到指定位置就在次回去屏幕两侧。当放到了指定位置就会出现一个火箭发射的动画。

2、完成的效果图

 

3、简单设计过程

自定义一个View完成火箭的拖动、显示,然后拖动到指定位置后就回调一个接口播放火箭发射动画。自定义View里面的关键就是动态的改变matrix,以达到火箭移动的效果

4、核心代码

自定义View的代码


import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;public class Rocket extends View {private Bitmap bitmap;private Bitmap rocket;private Bitmap[] stand = {BitmapFactory.decodeResource(getResources(),R.drawable.desktop_bg_tips_1),BitmapFactory.decodeResource(getResources(),R.drawable.desktop_bg_tips_2),BitmapFactory.decodeResource(getResources(),R.drawable.desktop_bg_tips_3) };private Matrix matrix = new Matrix();private Paint paint = new Paint();private boolean isTouch = false;private Point point = new Point();private LocationChangeListener changeListener = null;private int screenW;private int screenH;private boolean isFly = false;public Rocket(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);System.out.println("init_2");}public Rocket(Context context, AttributeSet attrs) {super(context, attrs);System.out.println("init_3");bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.floating_desktop_bg_danger);rocket = BitmapFactory.decodeResource(getResources(),R.drawable.desktop_rocket_launch_1);screenW = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth();screenH = ((Activity) context).getWindowManager().getDefaultDisplay().getHeight();System.out.println("blueberry_screenw=" + screenW);System.out.println("blueberry_screenH=" + screenH);}public Rocket(Context context) {super(context);System.out.println("init_1");}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);System.out.println("onDraw_1");System.out.println("isTouch=" + isTouch);if (!isTouch) {matrix.reset(); //重置matrixSystem.out.println("isFly=" + isFly);if (isFly) {if (changeListener != null)changeListener.onchange();} else {if (point.x < screenW / 2) {matrix.postTranslate(0, point.y);} else {matrix.postTranslate(screenW - bitmap.getWidth(), point.y);}canvas.drawBitmap(bitmap, matrix, paint);}} else {matrix.reset();int c = point.x % 2; //获取当前坐标的奇偶System.out.println("c="+c);matrix.postTranslate(screenW / 2 - stand[c].getWidth() / 2, screenH- stand[c].getHeight() - 100); //绘制云雾位置if (Math.abs(screenW / 2 - (point.x - rocket.getWidth() / 2)) < stand[c].getWidth() / 2&& Math.abs(screenH - stand[c].getHeight() - 100- (point.y - rocket.getHeight())) < stand[c].getHeight()) {canvas.drawBitmap(stand[2], matrix, paint);isFly = true;} else {//isFly = false;canvas.drawBitmap(stand[c], matrix, paint);}matrix.reset();matrix.postTranslate(point.x - rocket.getWidth() / 2, point.y- rocket.getHeight());  //火箭的位置canvas.drawBitmap(rocket, matrix, paint); //绘制火箭}}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:System.out.println("ACTION_DOWN");System.out.println("event.getX() < screenW - bitmap.getWidth()="+(event.getX() < screenW - bitmap.getWidth()));System.out.println("event.getX() > bitmap.getWidth()="+(event.getX() > bitmap.getWidth()));if ((event.getX() < screenW - bitmap.getWidth() && event.getX() > bitmap.getWidth())|| Math.abs(point.y - event.getY()) > bitmap.getHeight()) {return false;}isTouch = true;break;case MotionEvent.ACTION_MOVE:System.out.println("ACTION_MOVE");point.x = (int) event.getX();point.y = (int) event.getY();break;case MotionEvent.ACTION_CANCEL:System.out.println("ACTION_CANCEL");isTouch = false;break;case MotionEvent.ACTION_UP:System.out.println("ACTION_UP");isTouch = false;break;}invalidate();return true;}public void reset() {isFly = false;point.y = screenH / 2;invalidate();}public void setOnChangeListener(LocationChangeListener changeListener) {this.changeListener = changeListener;}}

5、总结

这个UI制作的时候老是纠结于,在View里面播放动画,找了老半天没有找到解决方法,最后就把动画放到了外面回调一下,虽然大体的效果出来了,但个人觉得还是有

不完善的地方,比如发射动画不是很平滑,没有加入电量显示,没有控制边界,小火箭拉到屏幕外后就看不到控制的小圆点了。最后欢迎大家的讨论,和指点。

6. 下载源码地址

高仿QQ的手机管家的小火箭加速

7. 更多源码地址

游戏源码

http://blog.csdn.net/xiabing082/article/details/41863003

应用源码

http://blog.csdn.net/xiabing082/article/details/10189827

高仿QQ的手机管家的小火箭加速相关推荐

  1. 【Android进阶】如何写一个很屌的动画(3)---高仿腾讯手机管家火箭动画

    系列中其他文章: [Android进阶]如何写一个很屌的动画(1)-先实现一个简易的自定义动画框架 [Android进阶]如何写一个很屌的动画(2)-动画的好帮手们 [Android进阶]如何写一个很 ...

  2. android qq底部图片选择器,Android 高仿QQ图片选择器

    当做一款APP,需要选择本地图片时,首先考虑的无疑是系统相册,但是Android手机五花八门,再者手机像素的提升,大图无法返回等异常因数,导致适配机型比较困难,微信.QQ都相继的在自己的APP里集成了 ...

  3. 安卓高仿QQ头像截取升级版

    观看此篇文章前,请先阅读上篇文章:高仿QQ头像截取: 本篇之所以为升级版,是在截取头像界面添加了与qq类似的阴影层(裁剪区域以外的部分),且看效果图:   为了适应大家不同需求,这次打了两个包,及上图 ...

  4. Android实现高仿QQ附近的人搜索展示

    本文主要实现了高仿QQ附近的人搜索展示,用到了自定义控件的方法 最终效果如下 1.下面展示列表我们可以使用ViewPager来实现(当然如果你不觉得麻烦,你也可以用HorizontalScrollVi ...

  5. android qq红点,Android高仿QQ小红点功能

    先给大家展示下效果图: 绘制贝塞尔曲线: 主要是当在一定范围内拖拽时算出固定圆和拖拽圆的外切直线以及对应的切点,就可以通过path.quadTo()来绘制二阶贝塞尔曲线了~ 整体思路: 1.当小红点静 ...

  6. android弹窗使用总结,高仿QQ空间操作弹窗

    android弹窗一共有两种方式,一种是dialog及其子类,另一种是popupwindow:Dialog及其子类尤其AlertDialog是最常用的,也是最自由的一种. **Popupwindow与 ...

  7. 小程序分类图标提取_腾讯手机管家“垃圾分类”小程序上线 get分类指南

    继7月1日上海正式实施"强制垃圾分类"后,全国首批46个城市试点垃圾分类也提上了日程.不过各地垃圾分类标准并不完全一致,譬如上海分为干垃圾.湿垃圾.可回收物与有害垃圾四类,而北京则 ...

  8. 仿腾讯手机管家火箭发射案例

    概述 和腾讯管家类似,360手机卫士上也有类似的功能:拖动小球到屏幕底部,然后小球变成火箭,松手后火箭发射.虽然两者的UI效果各有千秋,但原理基本上是相同的.因为时间的关系,我只实现了部分的UI效果, ...

  9. android 自定义特效,Android自定义View之高仿QQ健康

    我们都知道自定义View一般有三种直接继承View.继承原有的控件对控件的进行修改.重新拼装组合,最后一种主要针对于ViewGroup.具体的怎么做不是本文的所涉及的内容(本文是基于第一种方式实现的) ...

最新文章

  1. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找
  2. Java中创建线程需要使用的类_如何通过使用Java中的匿名类创建线程?
  3. 1.5亿美元!英国AI芯片创企今宣布获新融资,估值近20亿美元
  4. 三十岁前不必在乎的三十件事
  5. 晴天php下载,x.php · 一步晴天/smart - Gitee.com
  6. 前端学习(2794):实现拨打电话功能
  7. python requests get post_python+requests进行get、post方法接口测试
  8. 判断参数并赋予默认值
  9. show interface counter
  10. 在Struts2中实现登陆后跳转到登录前页面
  11. iOS cocoapods的使用规范说明及示例(.podspec配置文件)
  12. (2) python 使用pd.read_excel 读取excel时,选取某一列为索引
  13. 试用版本重装系统才能用是怎么回事_电脑重装系统老是失败,到底是怎么回事?这种现象是第一次碰到!...
  14. SEM竞价推广,如何选择关键词?
  15. AT绑定句柄无效和拒绝访问
  16. 客户流失预测——相关论文学习笔记
  17. 王思聪数字时钟android安卓/ios苹果下载
  18. R安装与卸载、RStudio安装
  19. 配置邮箱和邮件大小限制 !
  20. H264 profile 及帧类型介绍

热门文章

  1. pycharm 如何配置主题背景色 墨绿色
  2. Beta阶段基于spec评论作品
  3. 时间戳 与 Unix时间戳
  4. 生活细语:送给每一个热爱生活的人
  5. 几个shell编程的小案例
  6. 2023最新英皇CMS影视采集系统搭建程序源码+支持一键安装/功能强大
  7. uniapp开发微信小程序腾讯地图功能,生成地点云的sig签名
  8. Java SE 易错题
  9. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
  10. php 列表全选,php处理全选与全不选的实例代码