android开发:我想写一个悬浮窗要求满足以下需求:1 悬浮窗是全屏的透明的悬浮窗展示时不影响用户操作悬浮窗下面的界面用户不知道有悬浮窗在2 用户与屏幕交互时所有触摸事件都能穿透我的悬浮窗正常操作下面的界面3 用户的触摸事件穿透悬浮窗时记录下触摸位置能否实现?请给出详细代码不要省略按你刚才所说设置了WindowManagerLayoutParamsFLAG_NOT_TOUCH_MODAL和Win
要实现这样的悬浮窗效果,你需要使用WindowManager来添加悬浮窗,并设置LayoutParams来实现透明、全屏和触摸事件穿透的效果。下面是一个简单的示例代码:
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Build;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
public class FloatingWindowManager {
private Context mContext;
private WindowManager mWindowManager;
private View mFloatingView;
public FloatingWindowManager(Context context) {
mContext = context;
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
}
public void showFloatingWindow() {
// 创建悬浮窗视图
mFloatingView = new View(mContext);
mFloatingView.setBackgroundColor(0x80000000); // 设置为透明背景色
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.START | Gravity.TOP;
mWindowManager.addView(mFloatingView, params);
}
public void hideFloatingWindow() {
if (mFloatingView != null) {
mWindowManager.removeView(mFloatingView);
mFloatingView = null;
}
}
// 处理触摸事件
public boolean onTouch(MotionEvent event) {
// 记录触摸位置
float x = event.getRawX();
float y = event.getRawY();
// 返回false,使触摸事件穿透下去
return false;
}
}
在你的Activity中,你可以按照以下方式使用FloatingWindowManager:
public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
private FloatingWindowManager mFloatingWindowManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建FloatingWindowManager实例
mFloatingWindowManager = new FloatingWindowManager(this);
// 显示悬浮窗
mFloatingWindowManager.showFloatingWindow();
// 设置触摸监听器,处理触摸事件
mFloatingWindowManager.getFloatingView().setOnTouchListener(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 隐藏悬浮窗
mFloatingWindowManager.hideFloatingWindow();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// 处理触摸事件
return mFloatingWindowManager.onTouch(event);
}
}
这样就可以实现一个透明的悬浮窗,并且能够穿透触摸事件到下面的界面,并记录触摸位置。请注意,在Android 8.0及以上版本,需要使用TYPE_APPLICATION_OVERLAY作为LayoutParams的类型
原文地址: http://www.cveoy.top/t/topic/iYAq 著作权归作者所有。请勿转载和采集!