package net.xsmile.fv;
import android.app.Activity;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
public class MyFloatViewActivity extends Activity {
private Runnable childThread = new Runnable() {
int nowx = 5, nowy = 5;
boolean dx = false, dy = false;
@Override
public void run() {
// TODO Auto-generated method stub
Message msg = Message.obtain();
if(myFV.mTouchFlag) {
nowx = myFV.wmParams.x;
nowy = myFV.wmParams.y;
myFV.mTouchFlag = false;
}
msg.arg1 = nowx;
msg.arg2 = nowy;
// Log.i(TAG, "Runnable Thread:" + Thread.currentThread().getName());
mainHandler.sendMessage(msg);
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
if(nowx > dm.widthPixels - 60) {
dx = true;
}
if(nowy > dm.heightPixels - 80) {
dy = true;
}
if(nowx < 25) {
dx = false;
}
if(nowy < 25) {
dy = false;
}
if(dx) {
nowx -= 2;
}
if(!dx) {
nowx += 2;
}
if(dy) {
nowy -= 2;
}
if(!dy) {
nowy += 2;
}
}
};
private static final String TAG = "TAG";
Myhandler mainHandler, childHandler;
private DisplayMetrics dm;
private WindowManager wm = null;
private WindowManager.LayoutParams wmParams = null;
private MyFloatView myFV = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
createView();
dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
//获得手机的宽度和高度像素单位为px
// Log.i("OTH","手机屏幕分辨率为:" + dm.widthPixels+" * "+dm.heightPixels);
// 模拟home键按下的效果
Intent i = new Intent(Intent.ACTION_MAIN);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 如果是服务里调用,必须加入new task标识
i.addCategory(Intent.CATEGORY_HOME);
startActivity(i);
HandlerThread handlerThread = new HandlerThread("child_ron_Thread");
handlerThread.start();
mainHandler = new Myhandler(Looper.getMainLooper());
childHandler = new Myhandler(handlerThread.getLooper());
childHandler.postDelayed(childThread, 700);
}
class Myhandler extends Handler {
public Myhandler(Looper looper) {
super(looper);
}
public void handleMessage(Message msg) {
wmParams.x = msg.arg1;
wmParams.y = msg.arg2;
wm.updateViewLayout(myFV, wmParams);
Log.i(TAG, "handleMessage Thread:" + Thread.currentThread().getName() + " X = " + wmParams.x + " Y = " + wmParams.y);
childHandler.post(childThread);
//在子线程中处理,主线程中对button的响应很快;如果这边改成主线程处理则对主线程按钮的响应就慢了
// if (msg.arg1 >= 300) {
// childHandler.removeCallbacks(childThread);
// }
}
}
private void createView() {
myFV = new MyFloatView(getApplicationContext());
myFV.setImageResource(R.drawable.pp);
// 获取WindowManager
wm = (WindowManager) getApplicationContext().getSystemService("window");
// 设置LayoutParams(全局变量)相关参数
wmParams = ((MyApplication) getApplication()).getMywmParams();
wmParams.type = LayoutParams.TYPE_PHONE; // 设置window type
wmParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明
wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE;
/*
* 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
* wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
* LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;
*/
wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 调整悬浮窗口至左上角
// 以屏幕左上角为原点,设置x、y初始值
wmParams.x = 30;
wmParams.y = 30;
// 设置悬浮窗口长宽数据
wmParams.width = 40;
wmParams.height = 40;
// 显示myFloatView图像
wm.addView(myFV, wmParams);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
wm.removeView(myFV); // 不然会报View not attached to window manager的错误
wm.addView(myFV, wmParams);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
wm.removeView(myFV); // 不然会报View not attached to window manager的错误
wm.addView(myFV, wmParams);
}
@Override
public void onDestroy() {
super.onDestroy();
// 在程序退出(Activity销毁)时销毁悬浮窗口
childHandler.removeCallbacks(childThread);
wm.removeView(myFV);
Log.i("TAG", "销毁浮动窗口");
}
// /** get the launcher status */
// private boolean isLauncherRunnig(Context context) {
// boolean result = false;
// List<String> names = getAllTheLauncher();
// ActivityManager mActivityManager = (ActivityManager) context
// .getSystemService(Context.ACTIVITY_SERVICE);
// List<ActivityManager.RunningAppProcessInfo> appList = mActivityManager
// .getRunningAppProcesses();
// for (RunningAppProcessInfo running : appList) {
// if (running.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
// for (int i = 0; i < names.size(); i++) {
// Log.i("TAG", "names===" + names.get(i));
// if (names.get(i).equals(running.processName)) {
// result = true;
// break;
// }
// }
// }
// }
// Log.i("TAG", "是不是呢?????? " + result);
// return result;
// }
//
// private List<String> getAllTheLauncher() {
// List<String> names = null;
// PackageManager pkgMgt = this.getPackageManager();
// Intent it = new Intent(Intent.ACTION_MAIN);
// it.addCategory(Intent.CATEGORY_HOME);
// List<ResolveInfo> ra = pkgMgt.queryIntentActivities(it, 0);
// if (ra.size() != 0) {
// names = new ArrayList<String>();
// }
// for (int i = 0; i < ra.size(); i++) {
// String packageName = ra.get(i).activityInfo.packageName;
// names.add(packageName);
// }
// return names;
// }
// ////////////////////////监听HOME按键/////////////////////////////////////////////////////
// @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
// if (KeyEvent.KEYCODE_HOME == keyCode) {
// Log.i("TAG","HOMEHOMEHOME");
// Intent i = new Intent(Intent.ACTION_MAIN);
// i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 如果是服务里调用,必须加入new task标识
// i.addCategory(Intent.CATEGORY_HOME);
// startActivity(i);
// isLauncherRunnig(getApplicationContext());
// // android.os.Process.killProcess(android.os.Process.myPid());
// }
// return super.onKeyDown(keyCode, event);
// }
//
// @Override
// public void onAttachedToWindow() {
// this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
// Log.i("TAG","onAttachedToWindow");
// super.onAttachedToWindow();
// }
// //////////////////////监听HOME按键//////////////////////////////////////////////////////////
}
- 1
- 2
前往页