模仿苹果虚拟悬浮按钮(自动靠边、可浮现任何界面上)

news/2024/12/1 9:53:43/

  由于最近小蔡的手机音量键坏了,调节音量有点麻烦,突发奇想,想自己实现一个快捷键来调节音量,总结出一般本章,分享给大家。

首先 按钮要想实现悬浮在任何界面,那么必须是要写在服务里面的,使用定时器,2.5s不触摸后,背景变淡

下载地址

 

清单文件中加权限

 

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

 

 

public class FloatViewService extends Service {private static final String TAG = "FloatViewService";// 定义浮动窗口布局private LinearLayout mFloatLayout;private WindowManager.LayoutParams wmParams;// 创建浮动窗口设置布局参数的对象private WindowManager mWindowManager;private ImageButton mFloatView;private int screenHeight;private int screenWidth;private MyCountDownTimer myCountDownTimer;@Overridepublic void onCreate() {super.onCreate();Log.i(TAG, "onCreate");screenHeight = ScreenParam.getInstance().height;//自己写的工具类用来获取屏幕宽高。screenWidth = ScreenParam.getInstance().width;createFloatView();myCountDownTimer = new MyCountDownTimer(2500, 1000); //设置计时2.5smyCountDownTimer.start();}@SuppressWarnings("static-access")@SuppressLint("InflateParams")private void createFloatView() {wmParams = new WindowManager.LayoutParams();// 通过getApplication获取的是WindowManagerImpl.CompatModeWrappermWindowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE);// 设置window typewmParams.type = LayoutParams.TYPE_PHONE;// 设置图片格式,效果为背景透明wmParams.format = PixelFormat.RGBA_8888;// 设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)wmParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE;// 调整悬浮窗显示的停靠位置为右侧底部wmParams.gravity = Gravity.RIGHT | Gravity.BOTTOM;// 以屏幕左上角为原点,设置x、y初始值,相对于gravitywmParams.x = 0;wmParams.y = 150;// 设置悬浮窗口长宽数据wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;LayoutInflater inflater = LayoutInflater.from(getApplication());// 获取浮动窗口视图所在布局mFloatLayout = (LinearLayout) inflater.inflate(R.layout.alert_window_menu, null);// 添加mFloatLayoutmWindowManager.addView(mFloatLayout, wmParams);// 浮动窗口按钮mFloatView = (ImageButton) mFloatLayout.findViewById(R.id.alert_window_imagebtn);mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));// 设置监听浮动窗口的触摸移动mFloatView.setOnTouchListener(new OnTouchListener() {boolean isClick;private int leftDistance;private float rawX;private float rawY;@SuppressLint("ClickableViewAccessibility")@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mFloatLayout.setAlpha(1.0f);myCountDownTimer.cancel();取消计时rawX = event.getRawX();rawY = event.getRawY();break;case MotionEvent.ACTION_MOVE:// getRawX是触摸位置相对于屏幕的坐标,getX是相对于按钮的坐标int distanceX = (int) (event.getRawX()-rawX);int distanceY = (int) (event.getRawY()-rawY);leftDistance = (int) event.getRawX()+ mFloatView.getMeasuredWidth() / 2;wmParams.x = wmParams.x-distanceX;wmParams.y = wmParams.y-distanceY;// 刷新mWindowManager.updateViewLayout(mFloatLayout, wmParams);rawX = event.getRawX();rawY = event.getRawY();break;case MotionEvent.ACTION_UP:myCountDownTimer.start();重新开始计时if(wmParams.x>leftDistance){wmParams.x = screenWidth-mFloatView.getMeasuredWidth() / 2;}else{wmParams.x = 0;}mWindowManager.updateViewLayout(mFloatLayout, wmParams);break;}return false;}});mFloatView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {AudioManager audioManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,audioManager.getStreamVolume(AudioManager.STREAM_MUSIC), AudioManager.FLAG_SHOW_UI);
//				Toast.makeText(FloatViewService.this, "hello!",
//						Toast.LENGTH_SHORT).show();}});}@Overridepublic void onDestroy() {super.onDestroy();if (mFloatLayout != null) {// 移除悬浮窗口mWindowManager.removeView(mFloatLayout);}}@Overridepublic IBinder onBind(Intent intent) {return null;}public class MyCountDownTimer extends CountDownTimer {public MyCountDownTimer(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);}@Overridepublic void onTick(long millisUntilFinished) {}@Overridepublic void onFinish() {mFloatLayout.setAlpha(0.4f);}}}

 

 

然后再Activity里启动服务就好了

 

   protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ScreenParam.getInstance().init(this);}@Overrideprotected void onStart() {// TODO Auto-generated method stubIntent intent = new Intent(MainActivity.this, FloatViewService.class);  //启动FloatViewService  startService(intent);  super.onStart();}


如果不想显示Activity界面的话,可以在配置这个属性就ok了
android:theme="@android:style/Theme.NoDisplay"
就是这么简单!

 
 
 
 
 
 
 
 
 
 
 

http://www.ppmy.cn/news/442071.html

相关文章

android与ios返回按钮,Android与ios的系统交互模式差异

一、导航逻辑的差异 大家都知道ios没有实体返回键&#xff0c;所有返回都是通过导航栏的back按钮(图1)来完成。所以&#xff0c;ios应用大多数情况下&#xff0c;只提供单一路径&#xff0c;无论什么样的程序&#xff0c;都只有一个窗口&#xff0c;这个窗口用于放置程序的内容…

快应用之--模仿苹果手机屏幕的虚拟键,可以在手机上随意拖动

需求&#xff1a;多入口需悬挂在页面中&#xff0c;用户可以随意拖动&#xff0c;方便在页面上的多操作&#xff0c;如下图 思路&#xff1a;按钮拖动分为三步骤&#xff0c;拖动开始&#xff08;ontouchstart&#xff09;、拖动中(ontouchmove)、拖动结束(ontouchend) 在拖动…

Qt 之 自定义按钮 在鼠标 悬浮、按下、松开后的效果

Qt技术学习班开始了&#xff0c;更多精彩、好玩的内容等着你&#xff0c;赶紧报名吧! 群号&#xff1a;655815739 #一、简述 在上一篇 Qt 之 去除窗口部件被选中后的焦点虚线框 中&#xff0c;我们为了去除焦点虚线框&#xff0c;给按钮的样式加上了如下的样式。 QPushButton…

微信小程序之可拖动悬浮按钮的实现

微信小程序之可拖动悬浮按钮的实现 什么都不说先看效果图 下面上代码 wxml <button catchtouchmove"buttonMove" catchtouchstart"buttonStart" catchtouchend"buttonEnd" style"top:{{buttonTop}}px;left:{{buttonLeft}}px;width: 5…

vue 实现 浮动图标 仿iphone悬浮球

同级目录引用组件 ./ 上一级目录&#xff0c;两个点 …/ 原文应用案例 <!-- 给定一个初始位置position&#xff0c;插槽中填写想滑动的部分 --> <xuanfuqiu :position"position"><d-add-button click"addPigFarm" add-item"猪场&quo…

html给列表中每一行设置背景,教程丨如何设置内容的背景

原标题:教程丨如何设置内容的背景 秀米收到的投稿中,有好多非常会利用背景设计版面的文章,而他们也只是用了一张适合的图片设置成背景图,搭配文字内容,在阅读过程中视觉效果就会更立体,也就会觉得眼前一亮! 为能让更多小伙伴会利用布局制作背景,在本期教程中,我们将再…

【移动端网页布局】流式布局案例 ⑤ ( 连续排列的链接图片 | 设置盒子圆角 | 超出部分隐藏 | 设置浮动布局 | 精确计算浮动元素宽度避免换行 | 设置图片宽度自适应 )

文章目录 一、连续排列的链接图片样式及核心要点1、实现效果2、标签结构设置3、设置圆角和超过部分隐藏4、设置浮动并精确计算宽度5、设置图片宽度自适应 二、完整代码实例1、HTML 标签结构2、CSS 样式设置3、展示效果 一、连续排列的链接图片样式及核心要点 1、实现效果 实现如…

安卓仿苹果音量调节_Android 模仿苹果虚拟悬浮按钮(自动靠边、可浮现任何界面上)...

public classFloatViewService extends Service {private static final String TAG "FloatViewService";//定义浮动窗口布局 privateLinearLayout mFloatLayout;privateWindowManager.LayoutParams wmParams;//创建浮动窗口设置布局参数的对象 privateWindowManager…