欢迎访问宙启技术站
智能推送

Android实现悬浮可拖拽的Button

发布时间:2023-05-18 13:10:38

随着移动设备的普及,用户对于移动应用的界面交互体验越来越高。而悬浮窗体作为一种非常常见的交互模式,对于用户的方便性以及效率提升有着不可替代的作用。本文将介绍如何使用Android实现悬浮可拖拽的Button。

一、实现悬浮窗口

1.在AndroidManifest.xml中声明权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

2.在代码中调用WindowManager.addView()方法创建悬浮窗口

//1.获取WindowManager对象
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
//2.设置悬浮窗口的参数
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.type = WindowManager.LayoutParams.TYPE_PHONE;//设置悬浮窗口的类型
params.format = PixelFormat.RGBA_8888;
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
params.gravity = Gravity.TOP | Gravity.LEFT;//设置悬浮窗口的位置
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
//3.创建悬浮窗口
Button btnFloating = new Button(this);
btnFloating.setText("悬浮按钮");//设置悬浮按钮文字
btnFloating.setBackgroundColor(Color.YELLOW);//设置悬浮按钮的背景颜色
windowManager.addView(btnFloating, params);

二、实现悬浮可拖拽

1.在悬浮按钮控件中增加触摸事件的监控

btnFloating.setOnTouchListener(new View.OnTouchListener() {
    private int lastX, lastY;
    private int paramX, paramY;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
         int eventAction = event.getAction();
         switch (eventAction) {
            case MotionEvent.ACTION_DOWN:
                 //获取手指在屏幕上的坐标
                 lastX = (int) event.getRawX();
                 lastY = (int) event.getRawY();
                 paramX = params.x;
                 paramY = params.y;
                 break;
            case MotionEvent.ACTION_MOVE:
                 //计算手指在屏幕上移动的距离
                 int dx = (int) event.getRawX() - lastX;
                 int dy = (int) event.getRawY() - lastY;
                 params.x = paramX + dx;
                 params.y = paramY + dy;
                 //更新悬浮窗口的显示位置
                 windowManager.updateViewLayout(btnFloating, params);
                 break;
            case MotionEvent.ACTION_UP:
                 break;
            default:
                 break;
         }
         return false;
    }
});

2.在WindowManager.LayoutParams中添加FLAG_WATCH_OUTSIDE_TOUCH标志

params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                  | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;

这样设置之后,在悬浮窗口外侧的事件就会传递到底层的界面,而悬浮窗口本身不会接收到事件,从而可以实现悬浮可拖拽的效果。

以上就是Android实现悬浮可拖拽的Button的所有步骤,希望对大家有所帮助。