好久没有写过博客了,前段时间一个项目中用到了浮点(漂浮在窗体上),于是突发灵感发现可以实现类似于腾讯手机管家火箭升空效果

 实现步骤:1:新建一个类 名为RocketView(用来显示浮点,当手指拖动浮点变成火箭图标)

                        2:新建一个类 名LaunchView(火箭发射台,当手指拖动RocketView浮点到指定位置释放手指后 火箭深空)

                        3:在activity中调用RocketView的显示浮点方法进行演示

                        4:总结

1:新建一个类 名为RocketView(用来显示浮点,当手指拖动浮点变成火箭图标)

package com.masa.rocketlaunch;import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.os.Message;
import android.os.Vibrator;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.TextView;/*** author:janecer * email:jiangxiaocai@youline.com.cn* 2014年10月22日  下午3:41:59* 类说明 */
public class RocketView  extends FrameLayout{private static final String TAG = null;private static final  int ROCKET_SENDING=10;private static final int ROCKET_SENDED=11;private static final int VIBRATE=12;private static final String FLOAT_MARK="float_mark";private WindowManager wm;private WindowManager.LayoutParams wlp;private TextView tv_rocket;private Context ctx;private int statusBar;//状态栏高度private LaunchView launchView;private float x;private float y;//在拖到 发射台发射之前 几下浮点的位置,以便发射完后  把浮点设置到这个位置private float x_o;private float y_o;private float xInScrren;private float yInScrren;private Vibrator vibrator;private boolean isVibrator=false;private int rocket_height;//火箭的高度/*** 手机屏幕的宽度和高度*/private int s_width;private int s_height;/*** 判断火箭是否在飞行中,如果在飞行中,避免手指再次出破屏幕*/private boolean isFlying=false;//发射火箭 private Handler handler=new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case ROCKET_SENDING://发射火箭updatePosition();break;case ROCKET_SENDED://火箭发射完成launchView.removeView();launchView.setBackgroundResource(R.drawable.rocket_base);isFlying=false;setImage(false, false);xInScrren=x_o;yInScrren=y_o;updatePosition();break;case VIBRATE:vibrator.vibrate(msg.arg1);break;}  };};public RocketView(Context context) {this(context, null);}public RocketView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public RocketView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);this.ctx=context;//初始化屏幕的宽度和高度this.s_height=DimensionUtil.getHeight(context);this.s_width=DimensionUtil.getWidth(context);//给本布局设置 长度和高度ViewGroup.LayoutParams vlp=new ViewGroup.LayoutParams(-2,-2);this.setLayoutParams(vlp);this.setBackgroundColor(Color.TRANSPARENT);//初始化状态栏高度if(context instanceof Activity){initStatusBar((Activity)context);}vibrator=(Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);wm=(WindowManager) context.getSystemService(Context.WINDOW_SERVICE);wlp=new WindowManager.LayoutParams();//给显示浮点的ImaView初始化 tv_rocket=new TextView(context);tv_rocket.setGravity(Gravity.CENTER);FrameLayout.LayoutParams flp=new FrameLayout.LayoutParams(-2,-2);tv_rocket.setLayoutParams(flp);setImage(false,false);this.addView(tv_rocket);Log.i(TAG, "RocketView:___>");}/*** 设置发射台的window* @param lv*/public void setLaunchView(LaunchView lv){this.launchView=lv;}/*** 用来设置 图标是火箭图标 还是 圆形图标* @param isRocket   * @param isRelease  true表示 正在深空的火箭  */public void setImage(boolean isRocket,boolean isRelease){if(isRocket){tv_rocket.setText("");tv_rocket.setBackgroundResource(isRelease?R.drawable.rocket_release:R.drawable.rocket_unrelease);}else{//设置圆形图标tv_rocket.setBackgroundResource(R.drawable.float_);tv_rocket.setText(((Util.getUsefoMe(ctx)*100)/Util.getTotalMe())+"%");}
//      wlp.width = -2;
//      wlp.height =-2;
//      wm.updateViewLayout(this, wlp);}public void addToWindow(){wlp.width =  -2;wlp.height = -2;wlp.format=PixelFormat.RGBA_8888;wlp.type=WindowManager.LayoutParams.TYPE_PHONE;wlp.flags=WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;wlp.gravity=Gravity.LEFT|Gravity.TOP;wlp.x=DimensionUtil.getWidth(ctx)/2;wlp.y=(DimensionUtil.getHeight(ctx)-statusBar)/2;
//      wlp.alpha=0.5f;wm.addView(this,wlp);}public void removeViewFromWindow(){wm.removeView(this);}@Overridepublic boolean onTouchEvent(MotionEvent ev) {if(!isFlying){switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:x_o=ev.getRawX();y_o=ev.getRawY();this.x=ev.getX();this.y=ev.getY();setImage(true,false);launchView.addToWindow();break;case MotionEvent.ACTION_MOVE:this.xInScrren= ev.getRawX();this.yInScrren= ev.getRawY();updatePosition();//Log.i(TAG,"this.x:"+this.x+"   this.y:"+this.y);if(xInScrren>launchView.x-launchView.r&&xInScrren<launchView.x+launchView.r&&yInScrren>launchView.y-launchView.r&&yInScrren<launchView.y+launchView.r){//显示需要发射的火焰Log.i(TAG, "显示发射火焰");launchView.isShowFire(true);isVibrator=true;new Thread(){public void run() {while (isVibrator) {Message msg=Message.obtain();msg.arg1=(int) Math.round(Math.random() * 100+200);msg.what=VIBRATE;handler.sendMessage(msg);try {Thread.currentThread().sleep(msg.arg1);} catch (InterruptedException e) {e.printStackTrace();}}};}.start();}else{vibrator.cancel();isVibrator=false;launchView.isShowFire(false);}break;case MotionEvent.ACTION_UP:isVibrator=false;//根据火焰是否显示 决定是否发射火箭if(launchView.ivfire.getVisibility()==View.VISIBLE){//发射火箭Log.i(TAG, "发射火箭逻辑");launchView.ivfire.setVisibility(View.GONE);launchView.setBackgroundResource(R.drawable.smoke_m);setImage(true,true);isFlying=true;new Thread(){public void run() {int height=tv_rocket.getHeight();Log.i(TAG, "火箭的高度:"+height);while (yInScrren>0) {handler.sendEmptyMessage(ROCKET_SENDING);try {Thread.currentThread().sleep(1);} catch (InterruptedException e) {e.printStackTrace();}yInScrren-=2;}handler.sendEmptyMessage(ROCKET_SENDED);};}.start();}else{setImage(false,true);if(!isFlying){launchView.removeView();}}break;}}return super.onTouchEvent(ev);}public void updatePosition(){wlp.x=(int) (this.xInScrren-this.x);wlp.y=(int) (this.yInScrren-this.y-statusBar);wm.updateViewLayout(this,wlp);}/*** 初始化状态栏高度* @param act*/public void initStatusBar(Activity act){if(act.getWindow().getAttributes().flags==WindowManager.LayoutParams.FLAG_FULLSCREEN){statusBar=0;}else{try {Class<?> clazz=Class.forName("com.android.internal.R$dimen");Object obj=clazz.newInstance();int j = Integer.parseInt(clazz.getField("status_bar_height").get(obj).toString());statusBar = act.getResources().getDimensionPixelSize(j);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NumberFormatException e) {e.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();}}           }
}

2:新建一个类 名LaunchView(火箭发射台,当手指拖动RocketView浮点到指定位置释放手指后 火箭深空)

package com.masa.rocketlaunch;import java.text.Format;import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.RelativeLayout;/*** author:janecer * email:jiangxiaocai@youline.com.cn* 2014年10月23日  下午2:08:55* 类说明   火箭发射台*/
public class LaunchView extends RelativeLayout{private static final String TAG = LaunchView.class.getSimpleName();private WindowManager wm;private WindowManager.LayoutParams wlp;private Context ctx;public int x;//发射台的x坐标public int y;//发射台的y坐标public int r;//待中心点的半径private Handler handler=new Handler(){public void handleMessage(android.os.Message msg) {};};public ImageView ivfire;public LaunchView(Context context) {this(context, null);}public LaunchView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public LaunchView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);ctx=context;wm=(WindowManager) context.getSystemService(Context.WINDOW_SERVICE);wlp=new WindowManager.LayoutParams();ViewGroup.LayoutParams vlp=new ViewGroup.LayoutParams(-1,DimensionUtil.dip2px(context, 108));this.setLayoutParams(vlp);this.setBackgroundResource(R.drawable.rocket_base);ivfire = new ImageView(context);ivfire.setScaleType(ScaleType.FIT_XY);setImageFire();RelativeLayout.LayoutParams rlp=new RelativeLayout.LayoutParams((int) (DimensionUtil.getWidth(context)/4.5)*2,(int) (DimensionUtil.getWidth(context)/4.5));rlp.addRule(CENTER_IN_PARENT);this.addView(ivfire, rlp);r=(int) (DimensionUtil.getWidth(context)/4.5);x=DimensionUtil.getWidth(context)/2;y=DimensionUtil.getHeight(context)-r;Log.i(TAG, "x:"+x+"   y:"+y+"   r:"+r);}public void setImageFire( ){ivfire.setBackgroundResource(R.drawable.rocket_fire1);}public void isShowFire(boolean isshow){ivfire.setVisibility(isshow?View.VISIBLE:View.GONE);}public void addToWindow(){wlp.flags=WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;wlp.type=WindowManager.LayoutParams.TYPE_PHONE;wlp.gravity=Gravity.LEFT|Gravity.TOP;wlp.format=PixelFormat.RGBA_8888;wlp.width=this.getLayoutParams().width;wlp.height=this.getLayoutParams().height;wlp.x=0;wlp.y=DimensionUtil.getHeight(ctx);wm.addView(this,wlp);}public void removeView(){wm.removeView(this);}
}

3:在activity中调用RocketView的显示浮点方法进行演示

     RocketView rocketView=new RocketView(this.getApplicationContext());rocketView.setLaunchView(new LaunchView(this.getApplicationContext()));rocketView.addToWindow();

4:总结

浮点的实现主要使用到android api的WindowManager,以及对WIndowManager.LayoutParams的一些参数的熟悉。
作者能力有限,特别是设计模式方面 不是很懂,希望高手多多指点

仿腾讯手机管家火箭发射相关推荐

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

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

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

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

  3. 仿腾讯手机管家快捷中心功能的实现方案

    背景 想必用过Android腾讯手机管家或者做过相关研发的童鞋都会发现腾讯做了一个类似于iOS系统下的Panel功能,如下图一. 即从屏幕的底部或者侧部用手势划出快捷中心控制面板,如下图二. 有别于以 ...

  4. Android仿腾讯手机管家实现桌面悬浮窗小火箭发射的动画效果

    功能分析:  1.小火箭游离在activity之外,不依附于任何activity,不管activity是否开启,不影响小火箭的代码逻辑,所以小火箭的代码逻辑是要写在服务中:  2.小火箭挂载在手机窗体 ...

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

    高仿QQ的手机管家的小火箭加速 1.前言 腾讯的手机管家,用过这个App的人都应该知道桌面的火箭一键加速这个功能,研究一下这个小火箭是怎么做出来的.先来了解一下小火箭有神马动作,首先在没有触碰它时,就 ...

  6. 腾讯手机管家筹划“出海”

    摘要:正筹划推进旗下手机安全产品出海揽客.6月22日,腾讯无线安全产品部副总经理胡振东在上海表示,腾讯手机管家已推出了安卓国际版,下决心进军国际市场. 腾讯(00700.HK)正筹划推进旗下手机安全产 ...

  7. 安卓手机怎么root_怎么在腾讯手机管家中一键获取Root权限

    今天来说一下关于怎么在腾讯手机管家中一键获取Root权限这方面的一些讯息,不少朋友对于怎么在腾讯手机管家中一键获取Root权限这方面的信息颇感兴趣的.小编今天就为此整理一些相关的讯息,希望对有需要的朋 ...

  8. 类似腾讯手机管家应用android源码

    类似腾讯手机管家应用源码,也是自己写的android手机管家,内附源代码,应用实现了手机防功能,通信卫士功能,软件管家,进程管理,手机杀毒等功能,里面的图片部分用到了腾讯手机管家的图片,所以跟腾讯手机 ...

  9. Android用户分类管理,腾讯手机管家Android 7.10上线,微信整理助手实现智能精准分类...

    如今,大家习惯打开微信,或查看好友朋友圈动态,或浏览热点新闻.微信作为高频应用,带来了更加智能.便捷的生活,同时也让大家开始思考:当微信接收的信息越来越多,如何实现高效管理? 近日,腾讯手机管家上线了 ...

最新文章

  1. 2009年上半年网络工程师考试下午试卷参考答案(一)
  2. mega_[MEGA DEAL]终极Android N开发套件(90%折扣)
  3. [网络安全提高篇] 一一五.Powershell恶意代码检测 (3)Token关键词自动提取
  4. 计算机狐狸标志的程序,小狐狸等分线计算工具
  5. chrome网页自动化插件_chrome网页注释插件
  6. C语言 项目 CRM系统(客户信息管理系统)
  7. 分享Spring Cloud分布式微服务架构图
  8. RabbitMQ在Windows环境下部署(简单有效)
  9. xfire开发webservice
  10. 31.QT中串口操作
  11. ftp加速传输java_Java FTPClient 大量数据传输的问题(未解决)
  12. 二维数组最大值首尾相连
  13. w7电脑蓝屏怎么解决_电脑蓝屏Win32k.sys怎么办
  14. IDEA项目打包几种方式
  15. dstat 命令详解
  16. web项目对接钉钉扫码登录
  17. php匹配正则的方法,PHP实现正则匹配操作的方法
  18. JSP中通过checkbook实现批量管理
  19. 2020-08-24 光纤通信第五章知识点整理
  20. pool(三)——Timer

热门文章

  1. 计算机术语row是什么意思,rows是什么意思_rows怎么读_rows翻译_用法_发音_词组_同反义词_[计算机]行( row的名词复数 )-新东方在线英语词典...
  2. 2020年过氧化工艺考试及过氧化工艺考试技巧
  3. 解决win10下浏览器提示“浏览器已对此页面进行了修改,以帮助阻止跨站脚本”问题
  4. Charset编码问题导致的中文乱码
  5. R语言中进行期权定价的Heston模型
  6. IntelliJ IDEA插件系列全
  7. 内温的整体优先效应实验_熔盐电解制备钨铜合金粉体槽内温场条件分析
  8. 大数据的就业方向有哪些
  9. linux常用命令scp命令远程拷贝文件
  10. 宽带运营商大数据和机器学习支出将突破500亿美元