最近做一个悬浮球的项目,需求是全局可调用,所以必须用一个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;
}
}