悬浮窗可以显示在所有应用程序之上,不管在PC机还是Android设备上都有这个,最常见的是360的“加速球”
来看下在Android设备上的效果
程序的目录结构如下图
创建Activity后启动Service就关闭
[java]
packageimportimportimportimportpublic Activity {
•
•
• onCreate(Bundle savedInstanceState) {
• .onCreate(savedInstanceState);
• , FloatService.);
• }
悬浮窗的主要工作放在Service上处理
[java]
packageimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimport/**
• * 悬浮窗Service 该服务会在后台一直运行一个悬浮的透明的窗体
• * @author Administrator
• public Service {
• ;
•
•
• ;
• ;
• ;
• ;
• ;
• ;
• ;
• WindowManager windowManager;
• WindowManager.LayoutParams layoutParams;
•
•
• IBinder onBind(Intent arg0) {
•
• ;
•
• onCreate() {
•
• .onCreate();
•
• startId) {
•
• .onStart(intent, startId);
• );
• ;
• refresh();
•
• onDestroy() {
•
• .onDestroy();
• * 关闭悬浮窗
•
• removeView() {
• (viewAdded) {
• ;
• createFloatView() {
• HandlerUI();
• UpdateUI();
• Thread(update);
•
• ).inflate(R.layout.main, );
• .getSystemService(WINDOW_SERVICE);
• * LayoutParams.TYPE_SYSTEM_ERROR:保证该悬浮窗所有View的最上层
• * LayoutParams.FLAG_NOT_FOCUSABLE:该浮动窗不会获得焦点,但可以获得拖动
• LayoutParams(LayoutParams.WRAP_CONTENT,
•
• layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
• * 监听窗体移动事件
•
• OnTouchListener() {
• [] temp = [] { 0f, 0f };
• onTouch(View v, MotionEvent event) {
• eventaction = event.getAction();
• (eventaction) {
•
• ] = event.getX();
• ] = event.getY();
• ;
•
• MotionEvent.ACTION_MOVE:
• ) (event.getRawX() - temp[]),
• ) (event.getRawY() - temp[]));
• ;
• ;
• }
• OnClickListener() {
•
•
• onClick(View v) {
•
• ;
• );
• OnClickListener() {
•
• onClick(View v) {
•
• * 刷新悬浮窗
• * @param x
• * @param y
• y) {
•
• ) {
• Rect();
•
•
• refresh();
• * 添加悬浮窗或者更新悬浮窗 如果悬浮窗还没添加则添加 如果已经添加则更新其位置
• refresh() {
•
• (viewAdded) {
• {
• ;
• * 接受消息和处理消息
• * @author Administrator
• Handler {
• HandlerUI() {
•
• HandlerUI(Looper looper) {
• (looper);
• * 接收消息
•
• handleMessage(Message msg) {
•
•
• (msg.what == UPDATE_PIC) {
• (!viewHide)
• {
• .handleMessage(msg);
• }
• * 更新悬浮窗的信息
• * @author Administrator
• Runnable {
•
• run() {
•
•
• (!Thread.currentThread().isInterrupted()) {
•
•
• {
• );
• (InterruptedException e) {
•
• }
为悬浮窗创建布局文件
[html]
<?==?><=
• =
• =
• =
•
•
• =
• =
• =
• =
• =
• =
• =
•
• =
• =
• =
• =
• =
• =
• =
• =
• =
•
•
• =
• =
• =
• =
• =
• =
• =
• =
• =
•
• =
• =
• =
• =
• =
• =
• =
• =
• </>
悬浮窗上的控件就跟Activity上一样使用
悬浮窗上显示的一些内存信息,通过工具类:SysInfoUtils.java来读取