MainActivity.java:
package com.tyd.floatball.ui;
import com.tyd.floatball.R;
import com.tyd.floatball.R.layout;
import com.tyd.floatball.service.TopFloatService;
import Android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent service = new Intent();
service.setClass(this, TopFloatService.class);
//启动服务
startService(service);
}
}
TopFloatService.java:
package com.tyd.floatball.service;
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.os.IBinder;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.tyd.floatball.R;
import com.tyd.floatball.util.MyApplication;
public class TopFloatService extends Service implements OnClickListener,OnKeyListener{
WindowManager wm = null;
WindowManager.LayoutParams ballWmParams = null;
private View ballView;
private View menuView;
private float mTouchStartX;
private float mTouchStartY;
private float x;
private float y;
private RelativeLayout menuLayout;
private Button floatImage;
private PopupWindow pop;
private RelativeLayout menuTop;
private boolean ismoving = false;
@Override
public void onCreate() {
super.onCreate();
//加载辅助球布局
ballView = LayoutInflater.from(this).inflate(R.layout.floatball, null);
floatImage = (Button)ballView.findViewById(R.id.float_image);
setUpFloatMenuView();
createView();
}
/**
* 窗口菜单初始化
*/
private void setUpFloatMenuView(){
menuView = LayoutInflater.from(this).inflate(R.layout.floatmenu, null);
menuLayout = (RelativeLayout)menuView.findViewById(R.id.menu);
menuTop = (RelativeLayout)menuView.findViewById(R.id.lay_main);
menuLayout.setOnClickListener(this);
menuLayout.setOnKeyListener(this);
menuTop.setOnClickListener(this);
}
/**
* 通过MyApplication创建view,并初始化显示参数
*/
private void createView() {
wm = (WindowManager) getApplicationContext().getSystemService("window");
ballWmParams = ((MyApplication) getApplication()).getMywmParams();
ballWmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
ballWmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
ballWmParams.gravity = Gravity.LEFT | Gravity.TOP;
ballWmParams.x = 0;
ballWmParams.y = 0;
ballWmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
ballWmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
ballWmParams.format = PixelFormat.RGBA_8888;
//添加显示层
wm.addView(ballView, ballWmParams);
//注册触碰事件监听器
floatImage.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
x = event.getRawX();
y = event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
ismoving = false;
mTouchStartX = (int)event.getX();
mTouchStartY = (int)event.getY();
break;
case MotionEvent.ACTION_MOVE:
ismoving = true;
updateViewPosition();
break;
case MotionEvent.ACTION_UP:
mTouchStartX = mTouchStartY = 0;
break;
}
//如果拖动则返回false,否则返回true
if(ismoving == false){
return false;
}else{
return true;
}
}
});
//注册点击事件监听器
floatImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DisplayMetrics dm = getResources().getDisplayMetrics();
pop = new PopupWindow(menuView, dm.widthPixels, dm.heightPixels);
pop.showAtLocation(ballView, Gravity.CENTER, 0, 0);
pop.update();
}
});
}
/**
* 更新view的显示位置
*/
private void updateViewPosition() {
ballWmParams.x = (int) (x - mTouchStartX);
ballWmParams.y = (int) (y - mTouchStartY);
wm.updateViewLayout(ballView, ballWmParams);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.lay_main:
Toast.makeText(getApplicationContext(), "111", 1000).show();
break;
default:
if(pop!=null && pop.isShowing()){
pop.dismiss();
}
break;
}
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
Toast.makeText(getApplicationContext(), "keyCode:"+keyCode, 1000).show();
switch (keyCode) {
case KeyEvent.KEYCODE_HOME:
pop.dismiss();
break;
default:
break;
}
return true;
}
}