保持在所有窗口前方的悬浮按钮

来源:互联网 发布:谷歌浏览器mac安装 编辑:程序博客网 时间:2024/05/12 13:43

MainActivity.Java

  1. package com.example.floatviewdemo;  
  2.   
  3.   
  4. import com.example.floatviewdemo.service.FloatViewService;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.Intent;  
  8. import android.os.Bundle;  
  9.   
  10.   
  11. public class MainActivity extends Activity {  
  12.   
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.     }  
  18.       
  19.     @Override  
  20.     protected void onStart() {  
  21.          Intent intent = new Intent(MainActivity.this, FloatViewService.class);    
  22.          //启动FloatViewService    
  23.          startService(intent);    
  24.         super.onStart();  
  25.     }  
  26.       
  27.     @Override  
  28.     protected void onStop() {  
  29.         // 销毁悬浮窗  
  30.         Intent intent = new Intent(MainActivity.this, FloatViewService.class);    
  31.         //终止FloatViewService    
  32.         stopService(intent);   
  33.         super.onStop();  
  34.     }  
  35.       

floatviewdemo.service

package com.example.test;

    import android.annotation.SuppressLint;
    import android.app.Service;
    import android.content.Intent;
    import android.graphics.PixelFormat;
    import android.os.Handler;
    import android.os.IBinder;
    import android.os.Message;
    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.WindowManager;
    import android.view.WindowManager.LayoutParams;
    import android.widget.ImageButton;
    import android.widget.LinearLayout;
    import android.widget.Toast;

    public class FloatViewService extends Service {
        
        @Override
        public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub
            return null;
        }
        
        Handler handler = new Handler(){
            public void handleMessage(Message msg) {
                setAlpha(70);
            };
        };

        private static final String TAG = "FloatViewService";
        // 定义浮动窗口布局
        private LinearLayout mFloatLayout;
        private WindowManager.LayoutParams wmParams;
        // 创建浮动窗口设置布局参数的对象
        private WindowManager mWindowManager;

        private ImageButton mFloatView;

        @Override
        public void onCreate() {
            super.onCreate();
            Log.i(TAG, "onCreate");
            createFloatView();
        }

        private void setAlpha(int i) {
            mFloatView.getBackground().setAlpha(i);
        }

        @SuppressWarnings("static-access")
        @SuppressLint("InflateParams")
        private void createFloatView() {
            wmParams = new WindowManager.LayoutParams();
            // 通过getApplication获取的是WindowManagerImpl.CompatModeWrapper
            mWindowManager = (WindowManager) getApplication().getSystemService(
                    getApplication().WINDOW_SERVICE);
            // 设置window type
            wmParams.type = LayoutParams.TYPE_PHONE;
            // 设置图片格式,效果为背景透明
            wmParams.format = PixelFormat.RGBA_8888;
            // 设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)
            wmParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE;
            // 调整悬浮窗显示的停靠位置为左侧置顶
            wmParams.gravity = Gravity.LEFT | Gravity.TOP;
            // 以屏幕左上角为原点,设置x、y初始值,相对于gravity
            wmParams.x = 0;
            wmParams.y = 152;

            // 设置悬浮窗口长宽数据
            wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
            wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;

            LayoutInflater inflater = LayoutInflater.from(getApplication());
            // 获取浮动窗口视图所在布局
            mFloatLayout = (LinearLayout) inflater.inflate(
                    R.layout.alert_window_menu, null);
            // 添加mFloatLayout
            mWindowManager.addView(mFloatLayout, wmParams);
            // 浮动窗口按钮
            mFloatView = (ImageButton) mFloatLayout
                    .findViewById(R.id.alert_window_imagebtn);
            
            setAlpha(70);

            mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,
                    View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
                    .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
            // 设置监听浮动窗口的触摸移动
            mFloatView.setOnTouchListener(new OnTouchListener() {

                boolean isClick;

                @SuppressLint("ClickableViewAccessibility")
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    startAlphaThread();
                    switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        mFloatView.setBackgroundResource(R.drawable.ic_launcher);
                        isClick = false;
                        break;
                    case MotionEvent.ACTION_MOVE:
                        isClick = true;
                        // getRawX是触摸位置相对于屏幕的坐标,getX是相对于按钮的坐标
                        wmParams.x = (int) event.getRawX()
                                - mFloatView.getMeasuredWidth() / 2;
                        // 减25为状态栏的高度
                        wmParams.y = (int) event.getRawY()
                                - mFloatView.getMeasuredHeight() / 2 - 75;
                        // 刷新
                        mWindowManager.updateViewLayout(mFloatLayout, wmParams);
                        return true;
                    case MotionEvent.ACTION_UP:
                        mFloatView.setBackgroundResource(R.drawable.ic_launcher);
                        return isClick;// 此处返回false则属于移动事件,返回true则释放事件,可以出发点击否。

                    default:
                        break;
                    }
                    return false;
                }
            });

            mFloatView.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    startAlphaThread();
                    Toast.makeText(FloatViewService.this, "瞎点什么!!!",
                            Toast.LENGTH_SHORT).show();
                }

            });
        }
        private void startAlphaThread() {
            setAlpha(255);
            new Thread(new Runnable() {
                
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
                        handler.sendEmptyMessage(0);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();        
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            if (mFloatLayout != null) {
                // 移除悬浮窗口
                mWindowManager.removeView(mFloatLayout);
            }
        }

    }
记得添加权限<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

清单主题设置为android:theme="@android:style/Theme.NoDisplay"

0 0
原创粉丝点击