游戏SDK应用内悬浮窗的实现(一)
游戏SDK应用内悬浮窗的实现(二)
游戏SDK应用内悬浮窗的实现(三)
游戏SDK应用内悬浮窗的实现(四)

继上一篇的完成悬浮窗自动贴边吸附功能后,本篇继续开发让悬浮窗自动隐藏自身的一半,启动一个计时器,隐藏掉自生宽度一半即可。

项目依然是只需要用到两个文件即可FloatIconView与MainActivity


在编写代码之前请先去掉状态栏,这个就不用赘述了

<activityandroid:name=".MainActivity"android:theme="@style/Theme.AppCompat.Light.NoActionBar"
1、MainActivity与之前一样
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);FloatIconView floatIconView = new FloatIconView(this);}
}
2、activity_float_item.xml 也是和之前一样,(这里ImageView可以做消息提示红点拓展等,自行拓展)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/floaticon_btn"android:layout_width="100dp"android:layout_height="100dp"android:src="@drawable/ic_launcher" />
</RelativeLayout>
3、依然是FloatIconView,新增了倒计时代码,自动贴边后进行倒计时,数秒后隐藏原来悬浮窗的一半。
import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.CountDownTimer;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import android.widget.Toast;/*** Date:2022-10-18* Time:11:33* author:colin*/
public class FloatIconView extends RelativeLayout {private int millisInFuture = 3;//半隐藏悬浮球倒计时 秒private CountDownTimer countDownTimer;//倒计时 半隐藏悬浮球logo定时器private final static int LEFT = 0;private final static int RIGHT = 1;private int defPosition = RIGHT; //可变参数,随着吸附左右改变private WindowManager.LayoutParams wmParams;private WindowManager wm;private int screenHeight;private int screenWidth;private float mTouchStartX, mTouchStartY;private float x,y;private boolean isScroll;private int dpi;private Activity activity;private View view;public FloatIconView(Activity activity) {super(activity);this.activity = activity;init(activity);initTimer();}public void init(Activity activity) {view = LayoutInflater.from(activity).inflate(R.layout.activity_float_item, this);DisplayMetrics dm = activity.getResources().getDisplayMetrics();int widthPixels = dm.widthPixels;int heightPixels = dm.heightPixels;wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);//屏宽screenWidth = wm.getDefaultDisplay().getWidth();//屏高screenHeight = wm.getDefaultDisplay().getHeight();//通过像素密度来设置按钮的大小dpi = dpi(dm.densityDpi);wmParams = new WindowManager.LayoutParams();wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION;wmParams.format = PixelFormat.RGBA_8888;//设置背景图片wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//wmParams.gravity = Gravity.LEFT | Gravity.TOP;//wmParams.x = widthPixels; //设置位置像素wmParams.y = heightPixels;wmParams.width = 150; //设置图片大小wmParams.height = 150;wm.addView(view, wmParams);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// 获取相对屏幕的坐标, 以屏幕左上角为原点x = event.getRawX();y = event.getRawY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 获取相对View的坐标,即以此View左上角为原点mTouchStartX = event.getX();mTouchStartY = event.getY();//无论悬浮窗是否处于隐藏状态,点击以后让悬浮窗显示出来即可view.setScrollX(0);break;case MotionEvent.ACTION_MOVE:if (isScroll) {updateViewPosition();} else {// 当前不处于连续滑动状态 则滑动小于图标1/3则不滑动if (Math.abs(mTouchStartX - event.getX()) > dpi / 3|| Math.abs(mTouchStartY - event.getY()) > dpi / 3) {updateViewPosition();} else {break;}}isScroll = true;break;case MotionEvent.ACTION_UP:// 拖动if (isScroll) {//自动贴边代码增加在此处autoView();//倒计时自动半隐藏countDownTimer.start();} else {//点击悬浮窗clickView();}isScroll = false;mTouchStartX = mTouchStartY = 0;break;}return true;}/*** 自动移动位置*/private void autoView() {// 得到view在屏幕中的位置int[] location = new int[2];getLocationOnScreen(location);//左侧if (location[0] < screenWidth / 2 - getWidth() / 2) {updateViewPosition(LEFT);} else {updateViewPosition(RIGHT);}}/***更新浮动窗口位置参数*/private void updateViewPosition() {wmParams.x = (int) (x - mTouchStartX);// 不设置为全屏(状态栏存在) 标题栏是屏幕的1/25wmParams.y = (int) (y - mTouchStartY - screenHeight / 25);wm.updateViewLayout(this, wmParams);}/*** 手指释放更新悬浮窗位置*/private void updateViewPosition(int l) {switch (l) {case LEFT:defPosition = LEFT;//吸附后开启倒计时,倒计时结束后缩小图标wmParams.x = 0;break;case RIGHT:defPosition = RIGHT;int x = screenWidth - dpi ;wmParams.x = x;break;}wm.updateViewLayout(this, wmParams);}/*** 根据密度选择控件大小*/private int dpi(int densityDpi) {if (densityDpi <= 120) {return 36;} else if (densityDpi <= 160) {return 48;} else if (densityDpi <= 240) {return 72;} else if (densityDpi <= 320) {return 96;}return 108;}private void initTimer() {countDownTimer = new CountDownTimer(millisInFuture * 1000, 1000) {@Overridepublic void onTick(long millisUntilFinished) {if (isScroll) {timeCancel();}}@Overridepublic void onFinish() {System.out.println("倒计时完成");if (!isScroll) {if (defPosition == LEFT) {view.setScrollX(view.getWidth() / 2);} else {view.setScrollX(- view.getWidth() / 2);}wm.updateViewLayout(view, wmParams);} else {timeCancel();}}};countDownTimer.start();}/*** 取消倒计时*/private void timeCancel() {countDownTimer.cancel();}//当悬浮按钮被点击public void clickView(){Toast.makeText(activity,"悬浮按钮被点击!",Toast.LENGTH_SHORT).show();}
}
最终效果:


好了,这是悬浮窗的第四篇开发过程,由简单到复杂,不过总体来说也还是两个文件,所以使用起来不算复杂。

一般游戏SDK的悬浮按钮能够通过拖动到指定位置完全隐藏起来,隐藏后确实找不到了,只能重新打开游戏,当然有更好的方式就是通过手机摇一摇来再次显示悬浮窗帘。这一块就请自行摸索一下了

接下来,就是点击弹出用户界面的功能,用户界面可以切换或者注销功能,还有设置功能。

附上最后的资源链接
https://download.csdn.net/download/gsrkuang/86812918
积分不够的话可以联系我拿285184329

游戏SDK应用内悬浮窗的实现(四)相关推荐

  1. 游戏SDK应用内悬浮窗的实现(三)

    游戏SDK应用内悬浮窗的实现(一) 游戏SDK应用内悬浮窗的实现(二) 游戏SDK应用内悬浮窗的实现(三) 游戏SDK应用内悬浮窗的实现(四) 游戏SDK应用内悬浮窗的实现(三) 本篇继前两篇实现了悬 ...

  2. 360手机助手游戏怎么实名认证 360手机助手下载的游戏怎么关了悬浮窗

    360手机助手除了我们日常的传输文件,分享资源之外,上面还是有海量的游戏资源供我们下载的,而且平台还提供360币可以进行充值,不过很多小伙伴在下载游戏之后不知道在哪实名认证,哪里可以改实名认证?下面一 ...

  3. android悬浮动态权限,android应用内悬浮窗-自动贴边,不需要权限!

    简单基于注释的API来处理运行时6.0权限配置 热门度(没变化) 10.0/10 (没变化) ">10.0 活跃度(没变化) 0.8/10 (没变化) ">0.8 Wa ...

  4. android悬浮窗代码布局,三行代码实现Android应用内悬浮窗,无需一切权限,适配所有ROM和厂商...

    悬浮窗实现传统方案 对于传统悬浮窗和一些古老的"黑科技"悬浮窗的实现,想必已经有很多成熟的案例了,实现策略基本为以下两种:TYPE_SYSTEM_ALERT类型mWindowMan ...

  5. android申请悬浮窗代码,三行代码实现Android应用内悬浮窗,无需一切权限,适配所有ROM和厂商...

    悬浮窗实现传统方案 对于传统悬浮窗和一些古老的"黑科技"悬浮窗的实现,想必已经有很多成熟的案例了,实现策略基本为以下两种:TYPE_SYSTEM_ALERT类型mWindowMan ...

  6. Android 摄像头预览悬浮窗,可拖动,可显示在其他app上方

    市面上常见的摄像头悬浮窗,如微信.手机QQ的视频通话功能,有如下特点: 整屏页面能切换到一个小的悬浮窗 悬浮窗能运行在其他app上方 悬浮窗能跳回整屏页面,并且悬浮窗消失 我们探讨过用CameraX打 ...

  7. html 苹果桌面浮窗,苹果手机钉钉悬浮窗设置打开的方法

    如果我们使用的手机是苹果的,想要在使用钉钉应用软件的时候打开软件的悬浮窗,但是不知道在哪里设置,怎么样才可以打开的话,小编觉得我们可以在手机的设置一栏中找到复制设置这一选项,然后在其中进行相关的选择设 ...

  8. 8、Android 系统悬浮窗实现

    Android悬浮窗的简单实现_普通网友的博客-CSDN博客_android悬浮窗实现 Android悬浮窗的实现(易错点) https://www.jianshu.com/p/6ca8272d90e ...

  9. Android悬浮窗适配全机型,包含8.0,小米魅族华为悬浮窗权限适配demo看这一篇就够了

    机型多杂,适配无法完全兼容,不如换种实现方式,性能比悬浮窗好,不需要权限,效果更好:https://blog.csdn.net/m0_38058826/article/details/10399339 ...

最新文章

  1. java writestartarray_jackson的基础知识
  2. 写作—开启技术成长之路
  3. 用计算机画有常数的函数图像,信息技术应用 用计算机画函数图象教学设计及教案分析...
  4. web前端开发之div+css教程精华收集二
  5. spi四种工作模式时序图_还没学会SPI总线协议?干货都在这里
  6. PhoneGap插件入门(转)
  7. 为什么你应该用Yarn而不是Npm来管理你的项目依赖?
  8. python格式化字符串_Python字符串格式化问题:%、format()与f-strings
  9. (5)通过输入参数(测量数据)构建二维体模型(01)
  10. Windows设置开机自启动bat脚本
  11. #学习笔记 使用c语言来制作一个计算器
  12. 互联网快讯:菜鸟加码全球物流网络布局;猿辅导、掌门教育聚焦素质教育
  13. python模块cpca修改源码支持国外地址解析
  14. 本地文件搜索引擎项目说明
  15. 汉诺塔问题——递归算法
  16. 同步以太网-SyncE介绍
  17. 第三届云计算大会 - 华为李三琦:云计算发展与华为运战略(转载)
  18. java 百亿计算器_java面试题--实现一个百亿的计算器
  19. 【评测】内毒素检测方法盘点
  20. python画条形图并分类-python matplotlib库绘制条形图练习题

热门文章

  1. 报错grep: -P supports only unibyte and UTF-8 locales
  2. unravel中文音译
  3. 分享:信息爆炸时代,如何更好地处理工作信息
  4. AUTOSAR-RS-BSWAndRTEFeatures(中文版)
  5. peewee操作MySQL
  6. 374名10万+知乎大V(一):相互关注情况
  7. intel 三卷书籍 中文版 下载
  8. 对百度阿拉丁的深入解读
  9. Modelsim10.6d安装破解有问题
  10. 共享产品方案——扫码充电器整体方案