仿腾讯手机管家火箭发射

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

 实现步骤: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:[email protected]
 * 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);
	}

	@Override
	public 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 block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NumberFormatException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchFieldException e) {
				// TODO Auto-generated catch block
				e.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:[email protected]
 * 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的一些参数的熟悉。

作者能力有限,特别是设计模式方面 不是很懂,希望高手多多指点

时间: 2024-10-03 08:07:53

仿腾讯手机管家火箭发射的相关文章

类似腾讯手机管家应用源码完整版

类似腾讯手机管家应用源码,也是自己写的android手机管家,内附源代码,应用实现了手机防功能,通信卫士功能,软件管家,进程管理,手机杀毒等功能,里面的图片部分用到了腾讯手机管家的图片,所以跟腾讯手机管家应用比较类似了,大家可以参考一下,可能有的功能还没有那么完善,不过大家可以再这个基础上进行升级,创新,增加自己的特色吧.或者大家可以看看安装演示版(附件下面) 源码项目下载:http://code.662p.com/view/8982.html <ignore_js_op> <ignor

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

类似腾讯手机管家应用源码,也是自己写的android手机管家,内附源代码,应用实现了手机防功能,通信卫士功能,软件管家,进程管理,手机杀毒等功能,里面的图片部分用到了腾讯手机管家的图片,所以跟腾讯手机管家应用比较类似了,大家可以参考一下,可能有的功能还没有那么完善,不过大家可以再这个基础上进行升级,创新,增加自己的特色吧.或者大家可以看看安装演示版(附件下面) <ignore_js_op> <ignore_js_op> <ignore_js_op> <ignore

Android简易实战教程--第十话《模仿腾讯手机助手小火箭发射详解》

之前对系统自带的土司的源码做了简要分析,见博客:点击打开链接 这一篇给一个小案例,自定义土司,模拟腾讯卫士的小火箭发射.如果想要迅速看懂代码,建议先去看一下上篇介绍点击打开链接 首先,定义一个服务,在这个服务里面,完成土司的创建(小火箭布局创建) 烟的效果属于动画播放,而且要依托一个activity.(这个activity要定义为透明状态) 定义烟的activity的布局文件 <?xml version="1.0" encoding="utf-8"?>

通过线程通讯获取手机正在运行中的软件及大小(仿手机管家 扫描软件)

其实我原本是只想说一个线程之间的通讯 handler,但是觉得内容有点少,就直接写了个demo.我之前是做过仿手机管家这种软件的(当然只是自己做着好玩的),所以 就提取了一点内容结合线程通讯写了个小的demo. 不说废话了,直接上代码: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas

Android -- 桌面悬浮,QQ管家火箭实现

续上一篇博客<Android -- 桌面悬浮,仿360>,传送门:http://www.cnblogs.com/yydcdut/p/3909888.html,在此代码上继续添加实现. 比起普通的桌面悬浮窗,现在我们需要在拖动悬浮窗的时候将悬浮窗变成一个小火箭,并且在屏幕的底部添加一个火箭发射台.那么我们就从火箭发射台开始编写吧,首先创建launcher.xml作为火箭发射台的布局文件: <?xml version="1.0" encoding="UTF-8&

Launcher知识的demo,手机管家小伙家与悬浮窗

Launcher知识的demo,主要仿的手机管家小伙家与悬浮窗的效果.东西比较简单,直接贴代码 主要用到了windowManager 中的更新updateViewLayout(view,params),和 添加windowManager.addView()和删除windowManager.removeView() 移动launcher主要是updateViewLayout(view,params),中的params来实现 贴几个主要类,全部源码请自己下载 package com.pzf.flow

腾讯电脑管家

腾讯电脑管家 进程 QQPCTray.exe QQPCMgr.exe QQPCRTP.exe

【Android UI设计与开发】7.底部菜单栏(四)PopupWindow 实现显示仿腾讯新闻菜单

前一篇文章中有用到 PopupWindow 来实现弹窗的功能.简单介绍以下吧. 官方文档是这样解释的:这就是一个弹出窗口,可以用来显示一个任意视图.出现的弹出窗口是一个浮动容器的当前活动. 1.首先来个简单的栗子,效果如下: 只有两个布局文件,一个是弹窗布局(只有一张图片),一个是主界面布局(只有一个按钮). 然后在主界面代码中实例 PopupWindow ,指定弹出的界面,在按钮点击事件中显示或隐藏弹窗就可以了,代码如下: package com.yanis.demo; import andr

腾讯电脑管家,vs安装文件报成木马,还能信吗?

今天在公司安装vs2013,安装过程中腾讯公司的产品"电脑管家"提示有新版本,没有犹豫的点了升级,完成后直接在管家主界面上点了"全面体检"按钮,这一点不要紧,报告有一个木马,看紧看一下"详情",提示在系统注册表的RunOnce下有个键值,打开注册表跟踪到这个位置,仔细一看我放心了,这个文件是vs2013的主安装文件,iso是我从微软官网地址下载的,我相信微软不会拿自己的产品开这个玩笑,微软官网被黑,黑客把木马注入到2.8G的iso文件里的可能性更