android 悬浮球的实现,全部界面可用

最近做一个悬浮球的项目,需求是全局可调用,所以必须用一个Services。话不多说,直接上代码。

 

package com.android.settings.widget;

import java.lang.reflect.Method;

import com.android.settings.R;
import com.wits.pms.statuscontrol.ServiceManager;
import android.app.Instrumentation;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.media.AudioManager;
import android.os.IBinder;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.TextView;
//import android.widget.Toast;

public class FloatViewService extends Service {
	private FrameLayout mFloatLayout;
	private WindowManager.LayoutParams wmParams;
	private WindowManager mWindowManager, wm;
	private Button mFloatView;
	private int screenWidth, screenHeight;
	private View menuView;
	private TextView offSrceenBtn, brightBtn, backBtn, volBtn, appClean;
	private DisplayMetrics outMetrics;
	private WindowManager.LayoutParams menuWmParams;
	private final int LEFT_FLAG   = 0;
	private final int TOP_FLAG    = 1;
	private final int BOTTOM_FLAG = 2;
	private final int RIGHT_FLAG  = 3;
	private int mTouchSlop;
	private boolean isClick;
	
	@Override
	public void onCreate() {
		super.onCreate();
		createFloatView();
		setUpFloatMenuView();
		
		DisplayMetrics dm = FloatViewService.this.getResources().getDisplayMetrics();
		
		screenWidth  = dm.widthPixels;   
		screenHeight = dm.heightPixels - statuBarHeight(FloatViewService.this) - mFloatView.getMeasuredHeight() / 2;
		mTouchSlop   = ViewConfiguration.get(FloatViewService.this).getScaledTouchSlop();
		
//		Toast.makeText(getApplicationContext(), " screenWidth : " + screenWidth + " screenHeight : "  + screenHeight + " statuBar :" + statuBarHeight(FloatViewService.this), Toast.LENGTH_SHORT).show();
	}

	private void createFloatView() {
		wmParams = new WindowManager.LayoutParams();
		mWindowManager   = (WindowManager) FloatViewService.this.getSystemService(Context.WINDOW_SERVICE);
		
		wmParams.type    = LayoutParams.TYPE_PHONE;
		wmParams.format  = PixelFormat.RGBA_8888;
		wmParams.flags   = LayoutParams.FLAG_NOT_FOCUSABLE;
		wmParams.gravity = Gravity.RIGHT | Gravity.BOTTOM;
		wmParams.windowAnimations = android.R.style.Animation_Dialog;  
		
		wmParams.x = 0;
		wmParams.y = 150;
		wmParams.width  = WindowManager.LayoutParams.WRAP_CONTENT;
		wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;

		LayoutInflater inflater = LayoutInflater.from(FloatViewService.this);
		mFloatLayout = (FrameLayout) inflater.inflate(R.layout.floatball, null);
		mWindowManager.addView(mFloatLayout, wmParams);
		
		mFloatView   = (Button) mFloatLayout.findViewById(R.id.float_image);

		mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

		mFloatView.setOnTouchListener(new OnTouchListener() {
			private float rawX;
			private float rawY;

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
					isClick = true;
					
					rawX = event.getRawX();
					rawY = event.getRawY();
					break;
					
				case MotionEvent.ACTION_MOVE:
					int distanceX = (int) (event.getRawX() - rawX);
					int distanceY = (int) (event.getRawY() - rawY);

				    if (Math.abs(distanceX) > mTouchSlop || Math.abs(distanceY) > mTouchSlop) {
			            isClick = false;
			        }
				    
					 if(!isClick) {
						wmParams.x = wmParams.x - distanceX;
						wmParams.y = wmParams.y - distanceY;
						mWindowManager.updateViewLayout(mFloatLayout, wmParams);
						rawX = event.getRawX();
						rawY = event.getRawY();
					 }
					break;
					
				case MotionEvent.ACTION_UP:
					if (isClick) {
						if (!menuView.isShown()) {
							mFloatLayout.setVisibility(View.GONE);
							createMenuView(Gravity.CENTER);
						}
					} 
					
					/*else {
						int xPos = (int) event.getRawX() + mFloatView.getMeasuredWidth() / 2;
						int yPos = (int) event.getRawY() + mFloatView.getMeasuredHeight() / 2;

						switch (minDIstance(xPos, yPos)) {
						case LEFT_FLAG:
							wmParams.x = 0;
							break;

						case RIGHT_FLAG:
							wmParams.x = screenWidth - mFloatLayout.getMeasuredWidth() / 2;
							break;

						case TOP_FLAG:
							wmParams.y = 0;
							break;

						case BOTTOM_FLAG:
							wmParams.y = screenHeight - mFloatLayout.getMeasuredHeight() / 2;
							break;
						}
						
						mWindowManager.updateViewLayout(mFloatLayout, wmParams);
					}*/
					 break;
				}
				return false;
			}
		});
	}
	
	private void setUpFloatMenuView() {
		menuView 	 = LayoutInflater.from(FloatViewService.this).inflate(R.layout.floatmenu, null);
		offSrceenBtn = (TextView) menuView.findViewById(R.id.off_srceen_btn);
		brightBtn 	 = (TextView) menuView.findViewById(R.id.brightness_btn);
		backBtn 	 = (TextView) menuView.findViewById(R.id.btn_back);
		volBtn       = (TextView) menuView.findViewById(R.id.vol_btn);
		appClean     = (TextView) menuView.findViewById(R.id.btn_clean);

		offSrceenBtn.setOnClickListener(menuItemListen);
		brightBtn.setOnClickListener(menuItemListen);
		backBtn.setOnClickListener(menuItemListen);
		volBtn.setOnClickListener(menuItemListen);
		appClean.setOnClickListener(menuItemListen);

		menuView.setOnTouchListener(menuTouch);
	}
	
	private void createMenuView(int mGravity) {
		if (wm == null)           wm = (WindowManager) FloatViewService.this.getSystemService(Context.WINDOW_SERVICE);
		if (menuWmParams == null) menuWmParams = new WindowManager.LayoutParams();

		menuWmParams.type   = WindowManager.LayoutParams.TYPE_PHONE;
		menuWmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
		menuWmParams.flags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
		menuWmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
		menuWmParams.windowAnimations = android.R.style.Animation_Dialog;
		
		if(outMetrics == null) outMetrics = new DisplayMetrics();
		
		menuWmParams.x = outMetrics.widthPixels;
		menuWmParams.y = outMetrics.heightPixels;

		menuWmParams.width  = WindowManager.LayoutParams.WRAP_CONTENT;
		menuWmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
		menuWmParams.format = PixelFormat.RGBA_8888;
		wm.addView(menuView, menuWmParams);
	}
	
	private OnClickListener menuItemListen = new OnClickListener() {
		@Override
		public void onClick(View v) {
			switch (v.getId()) {
				case R.id.off_srceen_btn:
					sendKeyCode(300);
					
					mFloatLayout.setVisibility(View.VISIBLE);
					mRemoveView(menuView);

					break;
	
				case R.id.brightness_btn:
					startBrightness();
					
					mFloatLayout.setVisibility(View.VISIBLE);
					mRemoveView(menuView);
					break;
	
				case R.id.btn_back:
					sendKeyCode(4);
					break;
	
				case R.id.vol_btn:
					startVolume();
					
					mFloatLayout.setVisibility(View.VISIBLE);
					mRemoveView(menuView);

					break;
					
				case R.id.btn_clean:
					startClear();
					
					mFloatLayout.setVisibility(View.VISIBLE);
					mRemoveView(menuView);
					break;
			}
		}
	};
	
	private OnTouchListener menuTouch = new OnTouchListener() {
		@Override
		public boolean onTouch(View arg0, MotionEvent event) {
			switch (event.getAction()) {
				case MotionEvent.ACTION_OUTSIDE:
					mFloatLayout.setVisibility(View.VISIBLE);
					mRemoveView(menuView);
					break;
				}
			return false;
		}
	};
	
	void mRemoveView(View v) {
		if (mWindowManager != null && v != null && v.isShown())
			mWindowManager.removeViewImmediate(v);
	}
	
	private void startClear() {
		Intent intent = null;
		if(intent == null) {
			intent = new Intent("com.wits.clear.ACTION_CLEAR");
			intent.setPackage("com.wits.clear");
		}
		startService(intent);
	}
	
	private void startVolume() {
		AudioManager audioManager = null;
		if(audioManager == null) audioManager = (AudioManager) FloatViewService.this.getSystemService(Context.AUDIO_SERVICE);
		audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_SAME,AudioManager.FLAG_SHOW_UI);
	}
	
	private void startBrightness() {
		Intent intent = null;
		
		if(intent == null) {
			intent = new Intent("com.android.intent.action.SHOW_BRIGHTNESS_DIALOG_DAY");
			
			intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		} 
		startActivity(intent);
	}
	
	private void sendKeyCode(final int keycode) {
		new Thread() {
			@Override
			public void run() {
				new Instrumentation().sendKeyDownUpSync(keycode);
			}
		}.start();
	}
	
	private int minDIstance(float x, float y) {
		boolean left, top;

		if (x <= (screenWidth / 2/* - x*/)) {
			left = true;
		} else {
			left = false;
		}

		if (y <= (screenHeight / 2/* - y*/)) {
			top = true;
		} else {
			top = false;
		}
//////////////////////////////////////////////////////////		
		if (left && top) {
//			Toast.makeText(getApplicationContext(), " AAA ", Toast.LENGTH_SHORT).show();
			return RIGHT_FLAG;
		}

		if (left && (!top)) {
//			Toast.makeText(getApplicationContext(), " BBB ", Toast.LENGTH_SHORT).show();
			return RIGHT_FLAG;
		}

		if ((!left) && top) {
//			Toast.makeText(getApplicationContext(), " CCC ", Toast.LENGTH_SHORT).show();
			return LEFT_FLAG;
		}

		if ((!left) && (!top)) {
//			Toast.makeText(getApplicationContext(), " DDD ", Toast.LENGTH_SHORT).show();
			return TOP_FLAG;
		}

		/*
		if (left && top) {
			if (x <= y) {
				Toast.makeText(getApplicationContext(), " AAA ", Toast.LENGTH_SHORT).show();
				
				return LEFT_FLAG;
			} else {
				
				Toast.makeText(getApplicationContext(), " BBB ", Toast.LENGTH_SHORT).show();
				
				return TOP_FLAG;
			}
		}

		if (left && (!top)) {
			if (x <= (screenHeight - y)) {

				Toast.makeText(getApplicationContext(), " CCC " + x + " , y :" + y, Toast.LENGTH_SHORT).show();

				return LEFT_FLAG;
			} else {

				Toast.makeText(getApplicationContext(), " DDD X :" + x + " , y :" + y, Toast.LENGTH_SHORT).show();

				return BOTTOM_FLAG;
			}
		}

		if ((!left) & top) {
			if ((screenWidth - x) <= y) {
				
				Toast.makeText(getApplicationContext(), " EEE ", Toast.LENGTH_SHORT).show();
				
				return RIGHT_FLAG;
			} else {
				
				Toast.makeText(getApplicationContext(), " FFF ", Toast.LENGTH_SHORT).show();
				
				return TOP_FLAG;
			}
		}

		if ((!left) & (!top)) {
			if ((screenWidth - x) <= (screenHeight - y)) {
				
				Toast.makeText(getApplicationContext(), " GGG ", Toast.LENGTH_SHORT).show();
				
				return RIGHT_FLAG;
			} else {
				
				Toast.makeText(getApplicationContext(), " HHH ", Toast.LENGTH_SHORT).show();
				
				return BOTTOM_FLAG;
			}
		} */
		return 0;
	}
	
	@Override
	public void onDestroy() {
		super.onDestroy();
		mRemoveView(mFloatLayout);
		mRemoveView(menuView);
		
		wmParams       = null;
		mWindowManager = null;
		
		menuWmParams = null;
		menuView     = null;
	}

	private int statuBarHeight(Context context) {
		int result = 0;
		int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
		if (resourceId > 0) {
			result = context.getResources().getDimensionPixelSize(resourceId);
		}
		return result;
	}
	
	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}
}

 

你可能感兴趣的:(Android)