<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dfv="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/monk_relative_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/float_id"
android:layout_width="70dp"
android:layout_height="80dp"
android:layout_gravity="center_vertical|end"
android:scaleType="center"
android:src="@drawable/little_monk" />
</RelativeLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<floatwindow.xishuang.float_lib.view.DraggableFlagView
android:id="@+id/main_dfv"
android:layout_width="17dp"
android:layout_height="17dp"
android:layout_gravity="end"
dfv:color1="#FF3B30" />
</FrameLayout>
</FrameLayout>
@Override
public boolean onTouchEvent(MotionEvent event) {
// 获取相对屏幕的坐标,即以屏幕左上角为原点
int x = (int) event.getRawX();
int y = (int) event.getRawY();
//下面的这些事件,跟图标的移动无关,为了区分开拖动和点击事件
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
startTime = System.currentTimeMillis();
mTouchStartX = event.getX();
mTouchStartY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
//图标移动的逻辑在这里
float mMoveStartX = event.getX();
float mMoveStartY = event.getY();
// 如果移动量大于3才移动
if (Math.abs(mTouchStartX - mMoveStartX) > 3
&& Math.abs(mTouchStartY - mMoveStartY) > 3) {
// 更新浮动窗口位置参数
mWmParams.x = (int) (x - mTouchStartX);
mWmParams.y = (int) (y - mTouchStartY);
mWindowManager.updateViewLayout(this, mWmParams);
return false;
}
break;
case MotionEvent.ACTION_UP:
endTime = System.currentTimeMillis();
//当从点击到弹起小于半秒的时候,则判断为点击,如果超过则不响应点击事件
if ((endTime - startTime) > 0.1 * 1000L) {
isclick = false;
} else {
isclick = true;
}
break;
}
//响应点击事件
if (isclick) {
Toast.makeText(mContext, "我是大傻叼", Toast.LENGTH_SHORT).show();
}
return true;
}
// 如果移动量大于3才移动 if (Math.abs(mTouchStartX - mMoveStartX) > 3 && Math.abs(mTouchStartY - mMoveStartY) > 3)
/**
* 悬浮窗在服务中创建,通过暴露接口FloatCallBack与Activity进行交互
*/
public class FloatMonkService extends Service implements FloatCallBack {
/**
* home键监听
*/
private HomeWatcherReceiver mHomeKeyReceiver;
@Override
public void onCreate() {
super.onCreate();
FloatActionController.getInstance().registerCallLittleMonk(this);
//注册广播接收者
mHomeKeyReceiver = new HomeWatcherReceiver();
final IntentFilter homeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(mHomeKeyReceiver, homeFilter);
//初始化悬浮窗UI
initWindowData();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
/**
* 初始化WindowManager
*/
private void initWindowData() {
FloatWindowManager.createFloatWindow(this);
}
@Override
public void onDestroy() {
super.onDestroy();
//移除悬浮窗
FloatWindowManager.removeFloatWindowManager();
//注销广播接收者
if (null != mHomeKeyReceiver) {
unregisterReceiver(mHomeKeyReceiver);
}
}
/////////////////////////////////////////////////////////实现接口////////////////////////////////////////////////////
@Override
public void guideUser(int type) {
FloatWindowManager.updataRedAndDialog(this);
}
/**
* 悬浮窗的隐藏
*/
@Override
public void hide() {
FloatWindowManager.hide();
}
/**
* 悬浮窗的显示
*/
@Override
public void show() {
FloatWindowManager.show();
}
/**
* 添加可领取的数量
*/
@Override
public void addObtainNumer() {
FloatWindowManager.addObtainNumer(this);
guideUser(4);
}
/**
* 减少可领取的数量
*/
@Override
public void setObtainNumber(int number) {
FloatWindowManager.setObtainNumber(this, number);
}
}
/**
* 创建一个小悬浮窗。初始位置为屏幕的右下角位置。
*/
public static void createFloatWindow(Context context) {
wmParams = new WindowManager.LayoutParams();
WindowManager windowManager = getWindowManager(context);
mFloatLayout = new FloatLayout(context);
if (Build.VERSION.SDK_INT >= 24) { /*android7.0不能用TYPE_TOAST*/
wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
} else { /*以下代码块使得android6.0之后的用户不必再去手动开启悬浮窗权限*/
String packname = context.getPackageName();
PackageManager pm = context.getPackageManager();
boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.SYSTEM_ALERT_WINDOW", packname));
if (permission) {
wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
} else {
wmParams.type = WindowManager.LayoutParams.TYPE_TOAST;
}
}
//设置图片格式,效果为背景透明
wmParams.format = PixelFormat.RGBA_8888;
//设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)
wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
//调整悬浮窗显示的停靠位置为左侧置顶
wmParams.gravity = Gravity.START | Gravity.TOP;
DisplayMetrics dm = new DisplayMetrics();
//取得窗口属性
mWindowManager.getDefaultDisplay().getMetrics(dm);
//窗口的宽度
int screenWidth = dm.widthPixels;
//窗口高度
int screenHeight = dm.heightPixels;
//以屏幕左上角为原点,设置x、y初始值,相对于gravity
wmParams.x = screenWidth;
wmParams.y = screenHeight;
//设置悬浮窗口长宽数据
wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mFloatLayout.setParams(wmParams);
windowManager.addView(mFloatLayout, wmParams);
mHasShown = true;
//是否展示小红点展示
checkRedDot(context);
}
/**
* 返回当前已创建的WindowManager。
*/
private static WindowManager getWindowManager(Context context) {
if (mWindowManager == null) {
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
}
return mWindowManager;
}
if (Build.VERSION.SDK_INT >= 24) { /*android7.0不能用TYPE_TOAST*/
wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
} else { /*以下代码块使得android6.0之后的用户不必再去手动开启悬浮窗权限*/
String packname = context.getPackageName();
PackageManager pm = context.getPackageManager();
boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.SYSTEM_ALERT_WINDOW", packname));
if (permission) {
wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
} else {
wmParams.type = WindowManager.LayoutParams.TYPE_TOAST;
}
}
/**
* Author:xishuang
* Date:2017.08.01
* Des:与悬浮窗交互的控制类,真正的实现逻辑不在这
*/
public class FloatActionController {
private FloatActionController() {
}
public static FloatActionController getInstance() {
return LittleMonkProviderHolder.sInstance;
}
// 静态内部类
private static class LittleMonkProviderHolder {
private static final FloatActionController sInstance = new FloatActionController();
}
private FloatCallBack mCallLittleMonk;
/**
* 开启服务悬浮窗
*/
public void startMonkServer(Context context) {
Intent intent = new Intent(context, FloatMonkService.class);
context.startService(intent);
}
/**
* 关闭悬浮窗
*/
public void stopMonkServer(Context context) {
Intent intent = new Intent(context, FloatMonkService.class);
context.stopService(intent);
}
/**
* 注册监听
*/
public void registerCallLittleMonk(FloatCallBack callLittleMonk) {
mCallLittleMonk = callLittleMonk;
}
/**
* 悬浮窗的显示
*/
public void show() {
if (mCallLittleMonk == null) return;
mCallLittleMonk.show();
}
/**
* 悬浮窗的隐藏
*/
public void hide() {
if (mCallLittleMonk == null) return;
mCallLittleMonk.hide();
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有