Android悬浮框
16lz
2021-12-04
package com.apkstory.service;import com.apkstory.R;import com.apkstory.util.MyApplication;import android.app.Service;import android.content.Intent;import android.graphics.PixelFormat;import android.os.IBinder;import android.view.Gravity;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;import android.view.View.OnTouchListener;/** * 悬浮窗的制作 * @author 锋翼 * @link www.apkstory.com */public class TopFloatService extends Service { WindowManager wm = null; WindowManager.LayoutParams wmParams = null; View view; private float mTouchStartX; private float mTouchStartY; private float x; private float y; @Override public void onCreate() { super.onCreate(); view = LayoutInflater.from(this).inflate(R.layout.floating, null); createView(); } private void createView() { // 获取WindowManager wm = (WindowManager) getApplicationContext().getSystemService("window"); // 设置LayoutParams(全局变量)相关参数 wmParams = ((MyApplication) getApplication()).getMywmParams(); wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;// 该类型提供与用户交互,置于所有应用程序上方,但是在状态栏后面 wmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 不接受任何按键事件 wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 调整悬浮窗口至左上角 // 以屏幕左上角为原点,设置x、y初始值 wmParams.x = 0; wmParams.y = 0; // 设置悬浮窗口长宽数据 wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT; wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT; wmParams.format = PixelFormat.RGBA_8888; wm.addView(view, wmParams); view.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // 获取相对屏幕的坐标,即以屏幕左上角为原点 x = event.getRawX(); // 25是系统状态栏的高度,也可以通过方法得到准确的值,自己微调就是了 y = event.getRawY()-25 ; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 获取相对View的坐标,即以此View左上角为原点 mTouchStartX = event.getX(); mTouchStartY = event.getY()+view.getHeight()/2; break; case MotionEvent.ACTION_MOVE: updateViewPosition(); break; case MotionEvent.ACTION_UP: updateViewPosition(); mTouchStartX = mTouchStartY = 0; break; } return true; } }); } private void updateViewPosition() { // 更新浮动窗口位置参数 wmParams.x = (int) (x - mTouchStartX); wmParams.y = (int) (y - mTouchStartY); wm.updateViewLayout(view, wmParams); } @Override public IBinder onBind(Intent intent) { return null; }}
更多相关文章
- android 9.0通知栏适配,可用通知栏,悬浮通知,震动,提示音,
- [Android]自定义图片左上角斜着的View
- Android(安卓)悬浮按钮的简单实现
- Android(安卓)获取View的位置参数:x,y和相对父容器的偏移量以及中
- 悬浮顶层控件不受ScrollView影响
- 安装Android(安卓)studio 时候显示:SDK tools directory is missi
- Android(安卓)— 制作悬浮窗口
- Android我还可以相信你多少系列文章四之悬浮窗
- Android常用控件之悬浮窗