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

1、前言

相信很多人都用过腾讯的手机管家,用过这个App的人都应该知道桌面的火箭一键加速这个功能,当然这里我不是推荐大家去使用手机管家,相反这个功能大家还是小心为妙,我的U8800加完速之后快是快了,但这家伙把我手机的任务栏的进程都给搞蹦死了,去年买了个表啊。。。

吐槽不多说,来正题,最近刚好在学UI设计就去研究一下这个小火箭是怎么做出来的。先来了解一下小火箭有神马动作先,首先在没有触碰它时,就是一个电源的显示或是

一个图标依附在屏幕的两侧,点击变成小火箭,可以跟随拖动,当没有放到指定位置就在次回去屏幕两侧。当放到了指定位置就会出现一个火箭发射的动画。了解完效果,我

们继续说。

2、完成的效果图


3、简单设计过程

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

4、核心代码

自定义View的代码

[java]  view plain copy
  1. package com.spring.lettel;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.BitmapFactory;  
  7. import android.graphics.Canvas;  
  8. import android.graphics.Matrix;  
  9. import android.graphics.Paint;  
  10. import android.graphics.Point;  
  11. import android.util.AttributeSet;  
  12. import android.view.MotionEvent;  
  13. import android.view.View;  
  14.   
  15.   
  16. /** 
  17.  * 火箭主体类 
  18.  * @author wissea 
  19.  * 
  20.  */  
  21. public class Rocket extends View {  
  22.   
  23.     private Bitmap bitmap;  
  24.     private Bitmap rocket;  
  25.     //文字栏的三种状态  
  26.     private Bitmap[] stand = {  
  27.             BitmapFactory.decodeResource(getResources(),  
  28.                     R.drawable.desktop_bg_tips_1),  
  29.             BitmapFactory.decodeResource(getResources(),  
  30.                     R.drawable.desktop_bg_tips_2),  
  31.             BitmapFactory.decodeResource(getResources(),  
  32.                     R.drawable.desktop_bg_tips_3) };  
  33.     private Matrix matrix = new Matrix();  
  34.     private Paint paint = new Paint();  
  35.   
  36.     // 是否触摸  
  37.     private boolean isTouch = false;  
  38.     private Point point = new Point();  
  39.   
  40.     private LocationChangeListener changeListener   =null;  
  41.     //记录屏幕的大小  
  42.     private int screenW;  
  43.     private int screenH;  
  44.   
  45.     //灰机和提示是否重合了  
  46.     private boolean isFly = false;  
  47.   
  48.     public Rocket(Context context, AttributeSet attrs, int defStyle) {  
  49.         super(context, attrs, defStyle);  
  50.     }  
  51.   
  52.     public Rocket(Context context, AttributeSet attrs) {  
  53.         super(context, attrs);  
  54.         bitmap = BitmapFactory.decodeResource(getResources(),  
  55.                 R.drawable.floating_desktop_bg_danger);  
  56.         rocket = BitmapFactory.decodeResource(getResources(),  
  57.                 R.drawable.desktop_rocket_launch_1);  
  58.         screenW = ((Activity) context).getWindowManager().getDefaultDisplay()  
  59.                 .getWidth();  
  60.         screenH = ((Activity) context).getWindowManager().getDefaultDisplay()  
  61.                 .getHeight();  
  62.     }  
  63.   
  64.     public Rocket(Context context) {  
  65.         super(context);  
  66.     }  
  67.   
  68.     @Override  
  69.     protected void onDraw(Canvas canvas) {  
  70.         super.onDraw(canvas);  
  71.         //判断Touch  
  72.         if (!isTouch) {  
  73.             matrix.reset();  
  74.             if (isFly) {  
  75.                 if(changeListener!=null)  
  76.                     changeListener.onchange();  
  77.             } else {  
  78.                 if (point.x < screenW / 2) {  
  79.                     matrix.postTranslate(0, point.y);  
  80.                 } else {  
  81.                     matrix.postTranslate(screenW - bitmap.getWidth(), point.y);  
  82.                 }  
  83.                 canvas.drawBitmap(bitmap, matrix, paint);  
  84.             }  
  85.         } else {  
  86.             matrix.reset();  
  87.             int c = point.x % 2;  
  88.             matrix.postTranslate(screenW / 2 - stand[c].getWidth() / 2, screenH  
  89.                     - stand[c].getHeight() - 100);  
  90.             //判断重合  
  91.             if (Math.abs(screenW / 2 - (point.x - rocket.getWidth()/2)) < stand[c]  
  92.                     .getWidth() / 2  
  93.                     && Math.abs(screenH - stand[c].getHeight() - 100  
  94.                             - (point.y - rocket.getHeight())) < stand[c]  
  95.                                 .getHeight()) {  
  96.                 canvas.drawBitmap(stand[2], matrix, paint);  
  97.                 isFly = true;  
  98.             } else {  
  99.                 isFly       =false;  
  100.                 canvas.drawBitmap(stand[c], matrix, paint);  
  101.             }  
  102.             matrix.reset();  
  103.             matrix.postTranslate(point.x - rocket.getWidth()/2,  
  104.                     point.y - rocket.getHeight());  
  105.             canvas.drawBitmap(rocket, matrix, paint);  
  106.         }  
  107.   
  108.     }  
  109.   
  110.     @Override  
  111.     public boolean onTouchEvent(MotionEvent event) {  
  112.         switch (event.getAction()) {  
  113.         case MotionEvent.ACTION_DOWN:  
  114.             //过滤无效点击  
  115.             if ((event.getX() < screenW - bitmap.getWidth() && event.getX() > bitmap  
  116.                     .getWidth())  
  117.                     || Math.abs(point.y - event.getY()) > bitmap.getHeight()) {  
  118.                 return false;  
  119.             }  
  120.             isTouch = true;  
  121.             break;  
  122.         case MotionEvent.ACTION_MOVE:  
  123.             //更新坐标  
  124.             point.x = (int) event.getX();  
  125.             point.y = (int) event.getY();  
  126.             break;  
  127.         case MotionEvent.ACTION_CANCEL:  
  128.             isTouch = false;  
  129.             break;  
  130.         case MotionEvent.ACTION_UP:  
  131.             isTouch = false;  
  132.             break;  
  133.         }  
  134.         invalidate();  
  135.         return true;  
  136.     }  
  137.     //重置状态  
  138.     public void reset(){  
  139.         isFly   =false;  
  140.         point.y     =screenH/2;  
  141.         invalidate();  
  142.     }  
  143.     //监听重合  
  144.     public void setOnChangeListener(LocationChangeListener changeListener){  
  145.         this.changeListener         =changeListener;  
  146.     }  
  147.   
  148. }  

5、总结

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

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


项目源码



【原文:http://blog.csdn.net/spring_he/article/details/10431503】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值