Android开发浮动窗口
悬浮窗的type=2002 2003值;
悬浮窗的type=2002 2003值;悬浮窗作为一种特殊的窗口类型,用于在应用程序上方显示图形元素或交互控件。
在Android开发中,悬浮窗的类型通过设置youtParams中的type参数来定义。
其中,type=2002和type=2003是悬浮窗常用的类型。
下面将详细介绍这两种类型及其相关参考内容。
1. type=2002悬浮窗类型:TYPE_PHONE悬浮窗类型为TYPE_PHONE的窗口可以显示在状态栏之上,但是不获取焦点,也不能够接收触摸事件。
此类型的悬浮窗在使用过程中需要申请权限。
申请权限可以通过在AndroidManifest.xml文件中加入如下代码实现:```<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW " />```相应地,我们也需要在代码中进行权限申请,具体可参考官方文档的相关代码示例。
2. type=2003悬浮窗类型:TYPE_SYSTEM_ALERT悬浮窗类型为TYPE_SYSTEM_ALERT的窗口同样可以显示在状态栏之上,但是与TYPE_PHONE不同的是,TYPE_SYSTEM_ALERT窗口可以接收触摸事件。
在使用此类型的悬浮窗时,同样需要在AndroidManifest.xml文件中加入权限申请的代码。
除此之外,悬浮窗还有其他类型,例如type=2005的TYPE_TOAST悬浮窗类型。
不同类型的悬浮窗在显示效果和功能上有所区别,因此开发者需要根据不同的需求来选择合适的悬浮窗类型。
当然,在使用悬浮窗的过程中,还需要关注一些其他方面的内容,比如悬浮窗的位置、大小、背景、动画效果等。
youtParams提供了丰富的属性供开发者设置,例如gravity、width、height、x、y等,可以通过设置这些属性来实现对悬浮窗的定制化。
关于悬浮窗的具体实现方法,可以参考相关的官方文档和教程。
android 小米 自由窗口 实现原理
android 小米自由窗口实现原理一、引言Android系统中的小米自由窗口技术,是一种新型的显示和计算技术,具有高效率、低功耗等优点。
本篇文章将详细介绍自由窗口的实现原理,从硬件支持到软件设计,深入探讨自由窗口的技术特点和应用场景。
二、硬件支持小米自由窗口技术的实现,离不开其内置的显示芯片。
通过硬件级支持,显示芯片能够实现高效的多窗口处理,从而为自由窗口的实现提供了基础。
在硬件层面,显示芯片能够将多个窗口无缝拼接,实现高效的多任务处理。
三、软件设计自由窗口的实现主要依赖于Android系统中的WindowManager和SurfaceFlinger等API。
通过这些API,开发者可以创建和管理多个窗口,并在不同窗口之间进行切换。
自由窗口的核心思想是将应用程序的界面拆分成多个小窗口,这些窗口可以在屏幕上同时显示,从而实现高效的多任务处理。
每个窗口可以独立绘制,互不干扰,大大提高了显示效率。
四、技术特点1.高效率:自由窗口技术通过并行处理多个窗口,实现了高效的显示和计算。
多个窗口可以同时绘制,大大提高了显示效率。
2.低功耗:由于自由窗口技术可以独立绘制窗口,互不干扰,因此可以减少不必要的画面刷新,降低功耗。
3.可定制性强:开发者可以根据自己的需求,定制窗口的大小、位置、透明度等属性,以满足不同的应用场景。
五、应用场景1.多任务处理:自由窗口技术适用于需要同时处理多个任务的应用场景,如多任务办公、游戏等。
2.多媒体播放:自由窗口技术可以同时播放多个音视频文件,实现高效的多媒体播放。
3.视频会议:自由窗口技术适用于需要同时展示会议资料和视频会议界面的场景,提高会议效率。
六、总结小米自由窗口技术的实现原理主要依赖于硬件的支持和软件的优化设计。
通过将应用程序的界面拆分成多个小窗口,并在屏幕上同时显示,实现了高效的多任务处理。
自由窗口技术具有高效率、低功耗、可定制性强等优点,适用于多任务处理、多媒体播放和视频会议等多种应用场景。
android floatwindow使用方法 -回复
android floatwindow使用方法-回复Android FloatWindow 使用方法引言:Android平台上常常需要使用悬浮窗来实现一些特殊的功能,比如悬浮球、悬浮菜单等,而FloatWindow 是一个强大的开源库,可以帮助我们快速实现悬浮窗功能。
本文将详细介绍FloatWindow 的使用方法,包括引入FloatWindow 库、权限申请、悬浮窗的创建、更新和销毁等。
一、引入FloatWindow 库1. 在项目的build.gradle 文件中,添加依赖项:dependencies {implementation 'com.yhao.floatwindow:floatwindow:3.5.0'}2. 在需要使用FloatWindow 的地方,引入FloatWindow 类:javaimport com.yhao.floatwindow.FloatWindow;二、权限申请1. 在AndroidManifest.xml 文件中,添加必要的权限声明,例如悬浮窗权限:xml<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW" /> 2. 在需要使用悬浮窗的页面或服务中,添加权限申请代码:javaif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M&& !Settings.canDrawOverlays(context)) {Intent intent = newIntent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);intent.setData(Uri.parse("package:" +context.getPackageName()));context.startActivity(intent);}三、创建悬浮窗1. 创建悬浮窗前,需要先初始化FloatWindow,通常在Application 的onCreate 方法中进行初始化:javaFloatWindow.init(context.getApplicationContext());2. 创建一个悬浮窗的View,可以是一个自定义的View,也可以是系统提供的View,例如一个按钮:java自定义ViewView view =LayoutInflater.from(context).inflate(yout_custom_view, null);系统View(例如按钮)View view = new Button(context);3. 使用FloatWindow 来创建悬浮窗:javaFloatWindow.with(context).setView(view).setWidth(Screen.width, 0.2f) 设置悬浮窗宽度为屏幕宽度的20 .setHeight(Screen.width, 0.2f) 设置悬浮窗高度为屏幕宽度的20 .setX(Screen.width, 0.8f) 设置悬浮窗水平偏移为屏幕宽度的80 .setY(Screen.height, 0.3f) 设置悬浮窗垂直偏移为屏幕高度的30 .setDesktopShow(true) 设置悬浮窗显示在桌面上.build();四、更新悬浮窗1. 通过FloatWindow 的updateView 方法来更新悬浮窗的View:javaFloatWindow.get().updateView(view);2. 如果只需要更新悬浮窗的位置、大小等属性,可以使用updateX、updateY、updateWidth、updateHeight 等方法:javaFloatWindow.get().updateX(Screen.width, 0.6f); FloatWindow.get().updateY(Screen.height, 0.5f);五、销毁悬浮窗1. 使用FloatWindow 的destroy 方法销毁悬浮窗:javaFloatWindow.destroy();2. 如果只需要隐藏悬浮窗而不销毁,可以使用hide 方法:javaFloatWindow.get().hide();结尾:通过以上步骤,我们可以很方便地在Android 平台上使用FloatWindow 来创建、更新和销毁悬浮窗。
Android悬浮窗的简单实现
Android悬浮窗的简单实现⽬录概述原理Android的界⾯绘制,都是通过 WindowManager 的服务来实现的。
WindowManager 实现了 ViewManager 接⼝,可以通过获取 WINDOW_SERVICE 系统服务得到。
⽽ViewManager 接⼝有 addView ⽅法,我们就是通过这个⽅法将悬浮窗控件加⼊到屏幕中去。
为了让悬浮窗与Activity脱离,使其在应⽤处于后台时悬浮窗仍然可以正常运⾏,使⽤Service来启动悬浮窗并做为其背后逻辑⽀撑。
权限在 API Level >= 23 的时候,需要在AndroidManefest.xml⽂件中声明权限 SYSTEM_ALERT_WINDOW 才能在其他应⽤上绘制控件。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />除了这个权限外,我们还需要在系统设置⾥⾯对本应⽤进⾏设置悬浮窗权限。
该权限在应⽤中需要启动 Settings.ACTION_MANAGE_OVERLAY_PERMISSION 来让⽤户⼿动设置权限。
if (!Settings.canDrawOverlays(this)) {showError("当前⽆权限,请授权");startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), 0);} else {startService(new Intent(MainActivity.this, FloatingService.class));}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == 0) {if (!Settings.canDrawOverlays(this)) {showError("授权失败");} else {showMsg("授权成功");startService(new Intent(MainActivity.this, FloatingService.class));}}}LayoutParamWindowManager 的 addView ⽅法有两个参数,⼀个是需要加⼊的控件对象,另⼀个参数是 youtParam 对象。
popupwindow传递参数
popupwindow传递参数
标题:PopupWindow传递参数
引言:
PopupWindow是Android中常用的一种弹出式窗口,它可以在当前界面上方弹出一个浮动窗口,用于显示额外的信息或者进行操作。
在实际开发中,我们经常需要向PopupWindow传递一些参数,以实现更加灵活和个性化的功能。
本文将从五个大点来详细阐述PopupWindow传递参数的相关内容。
正文内容:
1. PopupWindow的基本介绍
1.1 PopupWindow的概念和作用
1.2 PopupWindow的创建和显示方式
1.3 PopupWindow的常用属性和方法
2. 传递参数的方式
2.1 使用构造方法传递参数
2.2 使用set方法传递参数
2.3 使用接口回调传递参数
3. 传递参数的注意事项
3.1 参数传递的数据类型和范围
3.2 参数传递的线程安全性
3.3 参数传递的性能考量
4. 示例演示
4.1 基本的参数传递示例
4.2 复杂参数传递示例
4.3 异步参数传递示例
5. 最佳实践和总结
5.1 选择合适的参数传递方式
5.2 合理管理参数传递的生命周期
5.3 总结和展望
总结:
本文通过对PopupWindow传递参数的相关内容进行详细阐述,从基本介绍、传递方式、注意事项、示例演示和最佳实践等五个大点进行了系统的论述。
希望读者能够通过本文对PopupWindow传递参数有更加深入的理解,从而在实际开发中能够灵活运用,提升应用的用户体验和功能扩展性。
Android创建悬浮窗的完整步骤
Android创建悬浮窗的完整步骤在Android中想要创建悬浮窗分为三步1.申请权限2.使⽤服务启动悬浮窗3.设置悬浮窗参数并添加进WindowManager下⾯话不多说了,来⼀起看看详细的实现过程申请权限⾸先需要申请悬浮窗权限,在清单⽂件中 manifest 下添加<!-- 低版本悬浮窗所需权限 --><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>在Activity中动态申请权限public class MainActivity extends Activity {/** 悬浮窗权限标识码 */public static final int CODE_WINDOW = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 申请悬浮窗权限if (Build.VERSION.SDK_INT >= 23) {if (!Settings.canDrawOverlays(this)) {Toast.makeText(this, "请打开此应⽤悬浮窗权限-Shendi", Toast.LENGTH_SHORT).show();startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), CODE_WINDOW); }}// 关闭当前activity,这样只显⽰悬浮窗finish();}// 权限申请成功后的回调@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {// 不给权限就退出case Permission.CODE_WINDOW:if (resultCode != Activity.RESULT_OK) System.exit(0);break;default:Toast.makeText(this, "未知权限回调: " + requestCode, Toast.LENGTH_SHORT).show();}}}使⽤服务启动悬浮窗对于悬浮窗的操作主要使⽤ WindowManager创建⼀个服务,并在清单⽂件中注册public class TestService extends Service {@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}@Overridepublic IBinder onBind(Intent intent) {return null;}}在清单⽂件的Application中注册服务<service android:name=".TestService" />在Activity中启动服务Intent intent = new Intent(this, TestService.class);startService(intent);接下来需要创建悬浮窗的界⾯,这⾥⽅便演⽰直接使⽤代码创建也可以使⽤inflate函数将xml⽂件变view对象View.inflate(context, yout.main_activity, null);在服务的onStartCommand函数中内容如下@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Button btn = new Button(this);btn.setText("hello,world");return super.onStartCommand(intent, flags, startId);}设置悬浮窗参数并添加进WindowManager这⾥直接上代码,看注释@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Button btn = new Button(this);btn.setText("hello,world");// 获取WindowManagerWindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); // 创建布局参数youtParams params = new youtParams(); /** 设置参数 */params.type = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?youtParams.TYPE_APPLICATION_OVERLAY :youtParams.TYPE_PHONE;params.format = PixelFormat.RGBA_8888;// 设置窗⼝的⾏为准则params.flags = youtParams.FLAG_NOT_FOCUSABLE;//设置透明度params.alpha = 1.0f;//设置内部视图对齐⽅式,这边位置为左边靠上params.gravity = Gravity.LEFT | Gravity.TOP;//窗⼝的左上⾓坐标params.x = 0;params.y = 0;//设置窗⼝的宽⾼,这⾥为⾃动params.width = youtParams.WRAP_CONTENT;params.height = youtParams.WRAP_CONTENT;// 添加进WindowManagerwm.addView(btn, params);return super.onStartCommand(intent, flags, startId);}完整代码如下TestActivitypackage shendi.app.game.robot;import android.app.Activity;import android.content.Intent;import .Uri;import android.os.Build;import android.os.Bundle;import android.provider.Settings;import android.widget.Toast;public class TestActivity extends Activity {/** 悬浮窗权限标识码 */public static final int CODE_WINDOW = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 申请悬浮窗权限if (Build.VERSION.SDK_INT >= 23) {if (!Settings.canDrawOverlays(this)) {Toast.makeText(this, "请打开此应⽤悬浮窗权限-Shendi", Toast.LENGTH_SHORT).show();startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), CODE_WINDOW); }}Intent intent = new Intent(this, TestService.class);startService(intent);// 关闭当前activity,这样只显⽰悬浮窗finish();}// 权限申请成功后的回调@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {// 不给权限就退出case Permission.CODE_WINDOW:if (resultCode != Activity.RESULT_OK) System.exit(0);break;default:Toast.makeText(this, "未知权限回调: " + requestCode, Toast.LENGTH_SHORT).show();}}}TestServicepackage shendi.app.game.robot;import android.app.Service;import android.content.Intent;import android.graphics.PixelFormat;import android.os.Build;import android.os.IBinder;import android.view.Gravity;import android.view.WindowManager;import android.widget.Button;public class TestService extends Service {@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Button btn = new Button(this);btn.setText("hello,world");// 获取WindowManagerWindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);// 创建布局参数youtParams params = new youtParams();/** 设置参数 */params.type = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?youtParams.TYPE_APPLICATION_OVERLAY :youtParams.TYPE_PHONE;params.format = PixelFormat.RGBA_8888;// 设置窗⼝的⾏为准则params.flags = youtParams.FLAG_NOT_FOCUSABLE;//设置透明度params.alpha = 1.0f;//设置内部视图对齐⽅式,这边位置为左边靠上params.gravity = Gravity.LEFT | Gravity.TOP;//窗⼝的左上⾓坐标params.x = 0;params.y = 0;//设置窗⼝的宽⾼,这⾥为⾃动params.width = youtParams.WRAP_CONTENT;params.height = youtParams.WRAP_CONTENT;// 添加进WindowManagerwm.addView(btn, params);return super.onStartCommand(intent, flags, startId);}@Overridepublic IBinder onBind(Intent intent) {return null;}}运⾏ app,可以在屏幕左上⾓看到 hello,world的按钮悬浮拖动效果给悬浮组件添加触碰事件可以实现拖动效果,按钮组件不适⽤这⾥给出简单的实现代码⽚段private int upX, upY;// 视图移动处理view.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getActionMasked()) {case MotionEvent.ACTION_DOWN:upX = (int) event.getRawX();upY = (int) event.getRawY();break;case MotionEvent.ACTION_MOVE:// 与上⼀次位置相差不到5则不移动if (event.getRawX() - upX > 5 || event.getRawY() - upY > 5) {params.x = (int) event.getRawX();params.y = (int) event.getRawY();wm.updateViewLayout(view, params);}break;case MotionEvent.ACTION_UP:// 相差不到5则代表点击if (event.getRawX() - upX < 5 && event.getRawY() - upY < 5) {// TODO}break;}return false;}});移除悬浮窗可以在 onDestry 函数中进⾏移除@Overridepublic void onDestroy() {wm.removeView(view);super.onDestroy();}总结到此这篇关于Android创建悬浮窗的⽂章就介绍到这了,更多相关Android悬浮窗内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
android全局悬浮窗的使用以及权限
android全局悬浮窗的使⽤以及权限
⼀、技术概述
平时使⽤微信时会发现,电话在退出通话界⾯时仍有⼀个圆形的悬浮窗,⽤于提⽰⽬前正在通话中,这个悬浮窗时全局的,可适⽤于当前版本的安卓⼿机
⼆、技术详述
1.⾸先我将需要展⽰的view写⼊设置悬浮窗的类中
2.初始化WindowManager,特别注意此时的android版本和权限的问题
3.添加或者删除view,在这样的情况下各种提⽰框会被覆盖掉
4.流程图
三、相关问题
1.权限
很多博客写的这段话是选择使⽤被我注释掉的那⼀种,那种写法适合更⽼的版本(⾄少是9.0之前)
2.提⽰框被覆盖
我个⼈的解决⽅式是把原先的悬浮窗全部去掉,等做完提⽰框的事情后再加回来,效果差不多
四、总结
悬浮框的使⽤还是⼗分⽅便的,除了权限的问题卡了⼀下,后续它的添加和删除,都是可以多个的,并不是说只能有⼀个悬浮框,⽽且悬浮框的样式和⼤⼩也可以⾃⼰设定。
五、参考资料。
android中实现悬浮窗口并滚动
android中实现悬浮窗口并滚动(2012-08-27 11:36:55)转载▼标签:it因为项目需要最近研究了android中实现悬浮并滚动的效果,笔记如下。
首先要实现一个自己画的滚动View.import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.Display;import android.view.View;import android.view.WindowManager;import android.view.View.OnClickListener;import android.widget.TextView;public class AutoScroll extends TextView {private float textLength = 0f;//文本长度private float viewWidth = 0f;private float step = 0f;//文字的横坐标private float y = 0f;//文字的纵坐标private float temp_view_plus_text_length = 0.0f;//用于计算的临时变量private float temp_view_plus_two_text_length = 0.0f;//用于计算的临时变量 public boolean isStarting = false;//是否开始滚动private Paint paint = null;//绘图样式private String text = "";//文本内容Canvas acanvas;private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg){onDraw(acanvas);}};public AutoScroll(Context context){super(context);// initView();}public AutoScroll(Context context, AttributeSet attrs){super(context, attrs);// initView();}public AutoScroll(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// initView();}// public void onClick(View v) {// if(isStarting)// stopScroll();// else// startScroll();// }// private void initView()// {// setOnClickListener(this);// }public void init(WindowManager windowManager){paint = getPaint();text = getText().toString();textLength = paint.measureText(text);//textview中字数的长度viewWidth = getWidth();if(viewWidth == 0){if(windowManager != null){Display display = windowManager.getDefaultDisplay();viewWidth = display.getWidth();}}step = textLength;temp_view_plus_text_length = viewWidth + textLength;temp_view_plus_two_text_length = viewWidth + textLength * 2;y = getTextSize() + getPaddingTop();}public void startScroll(){isStarting = true;invalidate();}public void stopScroll(){isStarting = false;invalidate();}public void onDraw(Canvas canvas) {acanvas = canvas;canvas.drawText(text, temp_view_plus_text_length - step, y, paint); if(!isStarting){return;}step += 2;//0.5为文字滚动速度。
Android中悬浮窗口的实现原理和示例代码
WindowManager的方法很简单,基本用到的就三个addView,removeView,updateViewLayout。
而youtParams的属性就多了,非常丰富,具体请查看SDK文档。这里给出Android中的WindowManager.java源码,可以具体看一下。
下面是简单示例代码:
public class myFloatView extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
* These windows are normally placed above all applications, but behind
* the status bar.
*/
public static final int TYPE_PHONE = FIRST_SYSTEM_WINDOW+2;
用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下:
调用WindowManager,并设置youtParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据youtParams属性不同,效果也就不同了。比如创建系统顶级窗口,实现悬浮窗口效果!
wm.addView(bb, wmParams); //创建View
}
}
别忘了在AndroidManifest.xml中添加权限:
Android桌面悬浮窗效果实现
49. // 当前界⾯不是桌⾯,且有悬浮窗显⽰,则移除悬浮窗。
50. else if (!isHome() && MyWindowManager.isWindowShowing()) {51. handler.post(new Runnable() {52. @Override53. public void run() {54. MyWindowManager.removeSmallWindow(getApplicationContext());55. MyWindowManager.removeBigWindow(getApplicationContext());56. }57. });58. }59. // 当前界⾯是桌⾯,且有悬浮窗显⽰,则更新内存数据。
60. else if (isHome() && MyWindowManager.isWindowShowing()) {61. handler.post(new Runnable() {62. @Override63. public void run() {64. MyWindowManager.updateUsedPercent(getApplicationContext());65. }66. });67. }68. }69.70. }71.72. /**73. * 判断当前界⾯是否是桌⾯74. */75. private boolean isHome() {76. ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);77. List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);78. return getHomes().contains(rti.get(0).topActivity.getPackageName());79. }80.81. /**82. * 获得属于桌⾯的应⽤的应⽤包名称83. *84. * @return 返回包含所有包名的字符串列表85. */86. private List<String> getHomes() {87. List<String> names = new ArrayList<String>();88. PackageManager packageManager = this.getPackageManager();89. Intent intent = new Intent(Intent.ACTION_MAIN);90. intent.addCategory(Intent.CATEGORY_HOME);91. List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,92. PackageManager.MATCH_DEFAULT_ONLY);93. for (ResolveInfo ri : resolveInfo) {94. names.add(ri.activityInfo.packageName);95. }96. return names;97. }98. }FloatWindowService的onStartCommand⽅法中开启了⼀个定时器,每隔500毫秒就会执⾏RefreshTask。
android 小窗 实现原理
android 小窗实现原理Android的小窗实现原理可以从多个角度来解释。
首先,小窗是指在Android系统中,应用程序可以以一种悬浮窗的形式显示在其他应用程序之上,用户可以在不离开当前应用的情况下进行操作。
以下是一些实现小窗功能的原理:1. 窗口管理器,Android系统提供了窗口管理器来管理应用程序的窗口。
窗口管理器负责绘制和显示窗口,并处理用户的输入事件。
小窗的实现依赖于窗口管理器的支持,它允许应用程序创建一个独立的窗口并显示在其他应用程序之上。
2. 悬浮窗权限,为了保证系统的安全性和用户的隐私,Android系统要求应用程序在显示悬浮窗之前获取特定的权限。
通过获取悬浮窗权限,应用程序可以在其他应用程序之上显示悬浮窗。
用户可以在系统设置中为应用程序授予或撤销悬浮窗权限。
3. 窗口类型,Android系统为窗口定义了不同的类型,每个类型都有不同的显示行为。
小窗通常使用TYPE_SYSTEM_ALERT或TYPE_APPLICATION_OVERLAY类型来实现。
这些类型的窗口可以显示在其他应用程序之上,并且不会被其他窗口遮挡。
4. 窗口布局和位置,小窗的布局和位置可以通过调整窗口的LayoutParams来实现。
LayoutParams定义了窗口的大小、位置、透明度等属性。
应用程序可以根据需要设置LayoutParams来控制小窗的显示效果。
5. 窗口交互,小窗通常需要与用户进行交互,例如接收用户的点击、拖动等操作。
应用程序可以通过监听触摸事件或者使用系统提供的手势识别功能来实现小窗的交互功能。
总结起来,Android小窗的实现原理涉及窗口管理器、悬浮窗权限、窗口类型、窗口布局和位置以及窗口交互等方面。
通过合理地使用这些机制,应用程序可以实现小窗功能,并提供更好的用户体验。
Android实现悬浮窗的简单方法实例
Android实现悬浮窗的简单⽅法实例⽬录1. 前⾔2.原理3.具体实现3.1浮窗布局3.2 悬浮窗的实现1. 使⽤服务Service2. 获取WindowManager并设置LayoutParams3. 创建View并添加到WindowManager4. 实现悬浮窗的拖拽和关闭功能5. 利⽤⼴播进⾏通信6. 设置权限3.3 完整代码4. 总结1. 前⾔现在很多应⽤都有⼩悬浮窗的功能,⽐如看直播的时候,通过Home键返回桌⾯,直播的⼩窗⼝仍可以在屏幕上显⽰。
下⾯将介绍下悬浮窗的的⼀种简单实现⽅式。
2.原理Window我们应该很熟悉,它是⼀个接⼝类,具体的实现类为PhoneWindow,它可以对View进⾏管理。
WindowManager是⼀个接⼝类,继承⾃ViewManager,从名称就知道它是⽤来管理Window的,它的实现类是WindowManagerImpl。
如果我们想要对Window(View)进⾏添加、更新和删除操作就可以使⽤WindowManager,WindowManager会将具体的⼯作交由WindowManagerService处理。
这⾥我们只需要知道WindowManager能⽤来管理Window就好。
WindowManager是⼀个接⼝类,继承⾃ViewManager,ViewManager中定义了3个⽅法,分布⽤来添加、更新和删除View,如下所⽰:public interface ViewManager {public void addView(View view, youtParams params);public void updateViewLayout(View view, youtParams params);public void removeView(View view);}WindowManager也继承了这些⽅法,⽽这些⽅法传⼊的参数都是View类型,说明了Window是以View的形式存在的。
android floatwindow使用方法
android floatwindow使用方法如何使用Android FloatWindow在Android 开发中,FloatWindow 是一个非常有用的功能,它可以在应用程序的顶部显示一个浮动窗口,在用户的视图之上。
这使得我们可以轻松地实现一些悬浮按钮、通知、广告、提示等功能。
在本文中,我们将介绍如何使用FloatWindow,并提供一步一步的指导。
步骤一:添加依赖库首先,我们需要在项目的build.gradle 文件中添加FloatWindow 的依赖库。
在dependencies 部分,添加以下行:dependencies {implementation 'com.yhao.floatwindow:floatwindow:1.0.1'}然后点击Sync Now,Gradle 将自动下载并导入所需的库文件。
步骤二:在AndroidManifest.xml 文件中添加权限FloatWindow 功能需要一些系统级权限才能正常工作,因此我们需要在AndroidManifest.xml 文件中添加以下权限:xml<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW" />步骤三:创建一个FloatWindow 的布局文件在res/layout 目录下,创建一个名为float_window_layout.xml 的布局文件。
在该文件中,我们可以定义要在浮动窗口中显示的视图内容。
以下是一个简单的示例:xml<LinearLayout xmlns:android="android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#FFFFFF"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello FloatWindow!" /><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Close" /></LinearLayout>步骤四:实现FloatWindow 功能在我们的代码中,我们将使用一个名为FloatWindow 的类来实现FloatWindow 的基本功能。
android popupwindow基本使用方法 -回复
android popupwindow基本使用方法-回复Android PopupWindow基本使用方法PopupWindow是Android提供的一种弹出式窗口,可以在当前Activity 界面上浮动展示额外的内容。
它通常用于向用户显示快捷操作或者展示特定信息。
本文将一步一步回答关于PopupWindow的基本使用方法,帮助您快速上手。
第一步:创建PopupWindow布局首先,我们需要创建PopupWindow的布局。
可以使用XML文件创建布局,也可以直接在代码中创建布局。
下面是一个例子:xml<LinearLayoutxmlns:android="android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><! 这里添加你需要展示的内容,比如TextView、ImageView等></LinearLayout>在这个例子中,我们创建了一个垂直方向的LinearLayout,你可以根据需要添加你自己的内容。
第二步:实例化PopupWindow对象接下来,我们需要在代码中实例化PopupWindow对象。
我们可以使用以下代码创建一个PopupWindow对象:javaPopupWindow popupWindow = new PopupWindow(view, width, height, focusable);- view:PopupWindow布局的根视图,可以是一个View或者通过LayoutInflater加载的View。
- width:PopupWindow的宽度,可以使用WrapContent或者指定具体的数值。
- height:PopupWindow的高度,同样可以使用WrapContent或者指定具体数值。
Android 浮动窗口进阶——画中画,浮动视频(附Demo)
复制代码
surfaceHolder = surfaceView.getHolder();
//回调,检测surfaceview的三种状态
surfaceHolder.addCallback(this);
//surfaceview的显示源类型
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mediaPlayer.setOnSeekCompleteListener(this);
mediaPlayer.setOnVideoSizeChangedListener(this);
String filePath = "/mnt/card/test.mp4";// "/mnt/sdcard/test.mp4";//
今天继续上一篇Android顶层窗口、浮动窗口的进阶应用。上一篇主要讲解了WindowManager服务和如何使用WindowManager编写一个顶层窗口。今天主要是讲讲如何在顶层窗口里面播放视频,这个功能对很多嵌入式设备来说十分有用。例如现在手机和平板上一些视频播放器就可以实现画中画功能,只显示一部分小窗口播放,用户可以继续操作其他功能。当你在看视频的时候收到短信,你只要进入画中画功能,视频可以继续播放,同时你可以去操作短信功能。
//Edited by mythou
///mythou/
//播放界面使用surfaceview实现
surfaceView = (SurfaceView) mlayoutView.findViewById(R.id.myView);
//获取surfaceHolder,控制surfaceview
Android开发悬浮按钮FloatingActionButton的实现方法
Android开发悬浮按钮FloatingActionButton的实现⽅法⼀、介绍这个类是继承⾃ImageView的,所以对于这个控件我们可以使⽤ImageView的所有属性android.support.design.widget.FloatingActionButton⼆、使⽤准备,在as 的 build.grade⽂件中写上compile 'com.android.support:design:22.2.0'三、使⽤说明xml⽂件中,注意蓝⾊字体部分<android.support.design.widget.FloatingActionButtonandroid:id="@+id/floatingActionButton"android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_centerInParent="true"android:src="@mipmap/ok"app:borderWidth="0dp"app:backgroundTint="#FF4011"app:rippleColor="#33728dff"app:elevation="8dp"app:pressedTranslationZ="16dp"/>可以看到我们使⽤了app属性,则需要在根容器中添加这个属性。
xmlns:app="/apk/res-auto"属性介绍:1、app:borderWidth=""------------------边框宽度,通常设置为0 ,⽤于解决Android 5.X设备上阴影⽆法正常显⽰的问题2、app:backgroundTint=""---------------按钮的背景颜⾊,不设置,默认使⽤theme中colorAccent的颜⾊3、app:rippleColor=""--------------------点击的边缘阴影颜⾊4、app:elevation=""----------------------边缘阴影的宽度5、app:pressedTranslationZ="16dp"-----点击按钮时,按钮边缘阴影的宽度,通常设置⽐elevation的数值⼤另外我们希望点击按钮⼀个颜⾊,正常状态⼀个颜⾊以提⾼⽤户体验,那么就是drawable⽂件夹中创建⽂件 floatbutton.xml <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="/apk/res/android"><item android:drawable="@color/colorNormal"></item><item android:state_pressed="true" android:drawable="@color/colorPressed"></item></selector>然后我们设置FloatActionButton的backgroud为这个drawable⽂件即可,同时app:backgroundTint=""属性也可以不再设置<android.support.design.widget.FloatingActionButtonandroid:id="@+id/floatingActionButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:background="@drawable/floatbutton"android:src="@mipmap/ok"app:borderWidth="0dp"app:rippleColor="#33728dff"app:elevation="8dp"app:pressedTranslationZ="16dp"/>效果图:。
android floatingactionbutton实现原理
android floatingactionbutton实现原理在Android开发中,Floating Action Button(浮动的操作按钮)是一种非常实用的控件,它通常位于屏幕的右下角,并且在屏幕上只有一个时才会显示出来。
这种设计为应用程序提供了视觉焦点,并且使其具有独特的设计风格。
在本篇文章中,我们将探讨AndroidFloating Action Button的实现原理。
一、概述Android Floating Action Button是一种特殊的按钮,它在屏幕上只有一个时才会显示出来。
它的主要作用是吸引用户的注意力,并作为一个方便的入口,使用户可以轻松地与应用程序进行交互。
二、实现原理1. 位置设计:Android Floating Action Button通常位于屏幕的右下角,这是为了保持用户视线向右下方集中,从而增强用户的操作体验。
2. 唯一性:在同一个应用程序中,Floating Action Button是唯一的。
这意味着在同一时间,屏幕上只能有一个Floating ActionButton出现。
3. 动画效果:Floating Action Button通常具有一个漂亮的动画效果,当它显示或隐藏时,会伴随着一个非常吸引人的效果,从而增强用户的视觉体验。
4. 交互方式:Floating Action Button通常与其他按钮或文本控件结合使用,作为用户与应用程序交互的入口。
三、实现步骤1. 设计外观:确定Floating Action Button的外观,包括颜色、大小、形状等。
2. 实现布局:在XML布局文件中,添加Floating Action Button控件,并设置其在屏幕中的位置和大小。
3. 实现动画:使用Android提供的动画资源或自定义动画,以增强Floating Action Button的视觉效果。
4. 与其他控件交互:将Floating Action Button与应用程序中的其他按钮、文本控件等结合使用,作为用户与应用程序交互的入口。
Android实现全局悬浮框
Android实现全局悬浮框本⽂实例为⼤家分享了Android实现全局悬浮框的具体代码,供⼤家参考,具体内容如下效果图:代码实现:Androidmanifest.xml添加弹框权限<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />⾃定义悬浮窗类FloatWindow.javapublic class FloatWindow implements View.OnTouchListener {private Context mContext;private youtParams mWindowParams;private WindowManager mWindowManager;private View mFloatLayout;private float mInViewX;private float mInViewY;private float mDownInScreenX;private float mDownInScreenY;private float mInScreenX;private float mInScreenY;private TextView infoText;public FloatWindow(Context context) {this.mContext = context;initFloatWindow();}private void initFloatWindow() {LayoutInflater inflater = LayoutInflater.from(mContext);if(inflater == null)return;mFloatLayout = (View) inflater.inflate(yout_float, null);infoText = mFloatLayout.findViewById(R.id.textView);mFloatLayout.setOnTouchListener(this);mWindowParams = new youtParams();mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);if (Build.VERSION.SDK_INT >= 26) {//8.0新特性mWindowParams.type = youtParams.TYPE_APPLICATION_OVERLAY;}else{mWindowParams.type = youtParams.TYPE_SYSTEM_ALERT;}mWindowParams.format = PixelFormat.RGBA_8888;mWindowParams.flags = youtParams.FLAG_NOT_FOCUSABLE;mWindowParams.gravity = Gravity.START | Gravity.TOP;mWindowParams.width = youtParams.WRAP_CONTENT;mWindowParams.height = youtParams.WRAP_CONTENT;}@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {return floatLayoutTouch(motionEvent);}private boolean floatLayoutTouch(MotionEvent motionEvent) {switch (motionEvent.getAction()) {case MotionEvent.ACTION_DOWN:// 获取相对View的坐标,即以此View左上⾓为原点mInViewX = motionEvent.getX();mInViewY = motionEvent.getY();// 获取相对屏幕的坐标,即以屏幕左上⾓为原点mDownInScreenX = motionEvent.getRawX();mDownInScreenY = motionEvent.getRawY() - getSysBarHeight(mContext);mInScreenX = motionEvent.getRawX();mInScreenY = motionEvent.getRawY() - getSysBarHeight(mContext);break;case MotionEvent.ACTION_MOVE:// 更新浮动窗⼝位置参数mInScreenX = motionEvent.getRawX();mInScreenY = motionEvent.getRawY() - getSysBarHeight(mContext);mWindowParams.x = (int) (mInScreenX- mInViewX);mWindowParams.y = (int) (mInScreenY - mInViewY);// ⼿指移动的时候更新⼩悬浮窗的位置mWindowManager.updateViewLayout(mFloatLayout, mWindowParams);break;case MotionEvent.ACTION_UP:// 如果⼿指离开屏幕时,xDownInScreen和xInScreen相等,且yDownInScreen和yInScreen相等,则视为触发了单击事件。
Android中可自由移动悬浮窗口的实现xsmilesBlog
Android中可自由移动悬浮窗口的实现xsmilesBlog Android中可自由移动悬浮窗口的实现2011年7月27日android, 技术相关7 评论第二届 Google 暑期大学生博客分享大赛 – 2011 Android 成长篇本文为参加Google暑期大学生博客分享大赛特别撰写。
—————————————————————-大家对悬浮窗概念不会陌生,相信每台电脑桌面的右上角都会有这么一个东西,它总是出现在所有页面的顶端(Top Show)。
但在Android平台中如何实现这样的效果呢?先来看一看效果图。
看见在Google搜索框上面的那个Icon图片了嘛。
下面我就来详细介绍一下在Android平台下悬浮窗口的实现,并让它能够随手指的触摸而移动。
一、实现原理及移动思路调用WindowManager,并设置youtParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据youtParams属性不同,效果也就不同了。
比如创建系统顶级窗口,实现悬浮窗口效果!然后通过覆写悬浮View中onTouchEvent方法来改变youtParams中x和y的值来实现自由移动悬浮窗口。
二、示例代码先来看一看悬浮View的代码,这里用一个ImageView作为演示01public class MyFloatView extends ImageView {02 private float mTouchStartX;03 private float mTouchStartY;04 private float x;05 private float y;0607 private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService("window");08 //此wmParams变量为获取的全局变量,用以保存悬浮窗口的属性09 private youtParams wmParams =((MyApplication)getContext().getApplicationContext()).getMywmParams();1011 public MyFloatView(Context context) {12 super(context);13 // TODO Auto-generated constructor stub14 }1516 @Override17 public boolean onTouchEvent(MotionEvent event) {18 //获取相对屏幕的坐标,即以屏幕左上角为原点19 x = event.getRawX();20 y = event.getRawY()-25; //25是系统状态栏的高度21 Log.i("currP", "currX"+x+"====currY"+y);22 switch(event.getAction()) {23 case MotionEvent.ACTION_DOWN: //捕获手指触摸按下动作24 //获取相对View的坐标,即以此View左上角为原点25 mTouchStartX = event.getX();26 mTouchStartY = event.getY();27 Log.i("startP","startX"+mTouchStartX+"====startY"+mTouchStartY);28 break;2930 case MotionEvent.ACTION_MOVE: //捕获手指触摸移动动作31 updateViewPosition();32 break;3334 case MotionEvent.ACTION_UP: //捕获手指触摸离开动作35 updateViewPosition();36 mTouchStartX=mTouchStartY=0;37 break;38 }39 return true;40 }4142 private void updateViewPosition(){43 //更新浮动窗口位置参数44 wmParams.x=(int)( x-mTouchStartX);45 wmParams.y=(int) (y-mTouchStartY);46 wm.updateViewLayout(this, wmParams); //刷新显示47 }4849}上面的wmParams变量(即youtParams)的存储采用了extends Application的方式来创建全局变量,示例代码如下:01public class MyApplication extends Application {0203 /**04 * 创建全局变量05 * 全局变量一般都比较倾向于创建一个单独的数据类文件,并使用static静态变量06 *07 * 这里使用了在Application中添加数据的方法实现全局变量08 * 注意在AndroidManifest.xml中的Application节点添加android:name=".MyApplication"属性09 *10 */11 private youtParams wmParams=new youtParams(); 1213 public youtParams getMywmParams(){14 return wmParams;15 }16}再来看一看Activity中的代码:01public class MyFloatViewActivity extends Activity {02 /** Called when the activity is first created. */0304 private WindowManager wm=null;05 private youtParams wmParams=null;0607 private MyFloatView myFV=null;080910 @Override11 public void onCreate(Bundle savedInstanceState) {12 super.onCreate(savedInstanceState);13 setContentView(yout.main);14 //创建悬浮窗口15 createView();1617 }18192021 private void createView(){22 myFV=new MyFloatView(getApplicationContext());23 myFV.setImageResource(R.drawable.icon); //这里简单的用自带的Icom来做演示24 //获取WindowManager25 wm=(WindowManager)getApplicationContext().getSystemService("window");26 //设置LayoutParams(全局变量)相关参数27 wmParams = ((MyApplication)getApplication()).getMywmParams();2829 /**30 *以下都是youtParams的相关属性31 * 具体用途可参考SDK文档32 */33 wmParams.type=LayoutParams.TYPE_PHONE; //设置window type34 wmParams.format=PixelFormat.RGBA_8888; //设置图片格式,效果为背景透明3536 //设置Window flag37 wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL38 | LayoutParams.FLAG_NOT_FOCUSABLE;39 /*40 * 下面的flags属性的效果形同“锁定”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
/**
* 跟谁滑动移动
*
* @param event
* 事件对象
* @param view
* 弹出对象实例(View)
* @return
*
* @param context
* 调用对象Context getApplicationContext()
* @param window
* 调用对象 Window getWindow()
// 加载xml文件中样式例子代码
// ********************************Start**************************
// LayoutInflater inflater =
// LayoutInflater.from(getApplicationContext());
* @author liujl v1.0 需要添加 <uses-permission
* android:name="android.permission.SYSTEM_ALERT_WINDOW"
* /><!--系统弹出窗口权限-->权限不然会报错
*/
params.height = youtParams.WRAP_CONTENT;
// 设定透明度
params.alpha = 80;
// 设定内部文字对齐方式
params.gravity = Gravity.LEFT | Gravity.TOP;
// panTime();
// 获取相对View的坐标,即以此View左上角为原点
mTouchStartX = event.getX();
mTouchStartY = event.getY();
state = MotionEvent.ACTION_MOVE;
updateViewPosition(view);
break;
case MotionEvent.ACTION_UP:
state = MotionEvent.ACTION_UP;
.getSystemService(Activity.WINDOW_SERVICE);
params.type = youtParams.TYPE_SYSTEM_ALERT
| youtParams.TYPE_SYSTEM_OVERLAY;
Log.i("startP", "startX" + mTouchStartX + "====startY"
+ mTouchStartY);// 调试信息
break;
case MotionEvent.ACTION_MOVE:
// 以屏幕左上角为原点,设置x、y初始值?
params.x = (int) x;
params.y = (int) y;
// tv = new MyTextView(TopFrame.this);
wm.addView(floatingViewObj, params);
FloatingFunc.java
package m;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.test.R;
/**
* 浮动显示对象
*/
private static View floatingViewObj = null;
/**
* 参数设定类
*/
public static youtParams params = new youtParams();
updateViewPosition(view);
mTouchStartX = mTouchStartY = 0;
break;
}
return true;
}
/**
public static int TOOL_BAR_HIGH = 0;
/**
* 要显示在窗口最前面的对象
*/
private static View view_obj = null;
/**
* 要显示在窗口最前面的方法
/**
* 鼠标触摸结束位置
*/
private static float mTouchStartY = 0;
/**
* windows 窗口管理器
*/
private static WindowManager wm = null;
*/
public static boolean onTouchEvent(MotionEvent event, View view) {
// 获取相对屏幕的坐标,即以屏幕左上角为原点
x = event.getRawX();
y = event.getRawY() - 25; // 25是系统状态栏的高度
public class FloatingFunc {
/**
* 浮动窗口在屏幕中的x坐标
*/
private static float x = 0;
/
private static float y = 200;
FloatingFunc.floatingViewObj = floatingViewObj;
view_obj = floatingViewObj;
Rect frame = new Rect();
// 这一句是关键,让其在top 层显示
/**
* 屏幕触摸状态,暂时未使用
*/
private static float state = 0;
/**
* 鼠标触摸开始位置
*/
private static float mTouchStartX = 0;
* @param floatingViewObj
* 要显示的浮动对象 View
*/
public static void show(Context context, Window window, View floatingViewObj) {
* 关闭浮动显示对象
*/
public static void close(Context context) {
if (view_obj != null && view_obj.isShown()) {
WindowManager wm = (WindowManager) context
// 加载xml文件中样式例子代码
// *********************************End***************************
//
// 关闭浮动显示对象然后再显示
close(context);
// getWindow()
window.getDecorView().getWindowVisibleDisplayFrame(frame);
TOOL_BAR_HIGH = frame.top;
wm = (WindowManager) context// getApplicationContext()
params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
// 设置悬浮窗口长宽数据
params.width = youtParams.WRAP_CONTENT;
// View view = inflater.inflate(yout.topframe, null);
// wm =
// (WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
import android.util.Log;
import android.view.Gravity;
import youtInflater;
import android.view.MotionEvent;
import android.view.View;
Log.i("currP", "currX" + x + "====currY" + y);// 调试信息
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
state = MotionEvent.ACTION_DOWN;
.getSystemService(Activity.WINDOW_SERVICE);
wm.removeView(view_obj);
}
}
/**
* 更新弹出窗口位置
*/
import android.view.Window;
import android.view.WindowManager;
import youtParams;
/**
* 可以永远显示在android屏幕最上方的浮动菜单
*