实现悬浮窗口自动吸附到屏幕边缘
2016-05-14 15:12
751 查看
2个View:FloatView SensorView随便继承个View类。FloatView作为悬浮窗显示按钮等等,SensorView使用OnHoverListener接口感知鼠标进入、移除屏幕边缘。
FloatView布局文件
ShowFlatBar()
FloatView布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <Button android:id="@+id/handup" android:layout_marginTop="4dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="36sp" android:drawableLeft="@drawable/floatbar_handup" android:background="#66CD00" > </Button> <Button android:id="@+id/reboot_terminal" android:layout_marginTop="4dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="36sp" android:drawableLeft="@drawable/floatbar_reboot_terminal" android:background="#66CD00" > </Button> <Button android:id="@+id/poweroff_terminal" android:layout_marginTop="4dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="36sp" android:drawableLeft="@drawable/floatbar_poweroff_terminal" android:background="#66CD00" ></Button> <Button android:id="@+id/reboot_vm" android:layout_marginTop="4dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="36sp" android:drawableLeft="@drawable/floatbar_reboot_vm" android:background="#66CD00" > </Button> <Button android:id="@+id/window_close" android:layout_marginTop="4dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="36sp" android:drawableLeft="@drawable/floatbar_window_close" android:background="#66CD00" > </Button> </LinearLayout>SensorView布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <ImageButton android:id="@+id/sensor111" android:layout_width="320dp" android:layout_height="1dp" android:background="@drawable/sensor"//就是一条非常细的线,紧贴屏幕边缘 android:visibility="gone" /> </LinearLayout>在MainActivity中创建FloatView SensorView对象,并设置布局文件,动态加载布局文件。
floatView = new FloatView(getApplicationContext()); //floatView.setla LayoutInflater.from(floatView.getContext()).inflate(R.layout.float_bar, floatView, true); sensor = new FloatView(getApplicationContext()); LayoutInflater.from(sensor.getContext()).inflate(R.layout.sensor_bar, sensor,true); getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);在MainActivity中写2个方法:ShowFloatBar,ShowSensorBar。基本一样,这是OnHoverListener有区别
ShowFlatBar()
public void ShowFloatBar() { floatView.setVisibility(View.VISIBLE); floatView.setOnHoverListener(new OnHoverListener() { @Override public boolean onHover(View v, MotionEvent event) { // TODO Auto-generated method stub final int keyStowevent = event.getAction(); if (keyStowevent == MotionEvent.ACTION_HOVER_ENTER|| keyStowevent == MotionEvent.ACTION_HOVER_MOVE) { if(PrintLog.flag) Log.i(TAG, "get Hover"); // keyStow2.setVisibility(View.GONE); floatView.setVisibility(View.VISIBLE); hoverintoolbar=true; // setSystemCursorVisible(); //toolBarHandler.postDelayed(showtoolbar, 100); toolBarHandler.removeCallbacks(closetoolbar); if(PrintLog.flag) Log.i("TAG", "last hoverintoolbar= " + hoverintoolbar + " last hoverinsensor= " + hoverinsensor); } if ((keyStowevent == MotionEvent.ACTION_HOVER_EXIT)) { hoverintoolbar = false; if(PrintLog.flag) Log.i("TAG", "1111last hoverintoolbar= " + hoverintoolbar+ " last hoverinsensor= " + hoverinsensor); // setSystemCursorHide(); new Thread(new Runnable() { @Override public void run() { toolBarHandler.postDelayed(closetoolbar, 1200); } }).start(); } return false; } }); final Button handUpBtn = (Button)floatView.findViewById(R.id.handup); handUpBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub handUpBtn.setBackgroundResource(R.drawable.floatbar_handup_cancel); new AlertDialog.Builder(aSPICE.this).setTitle("举手").show(); String handup = StartUp.ConstructMessage(Constant.teacherUUid, Constant.MSGTYPE_STUDENT_HANDUP); synchronized (this) { Constant.SendMessageList.add(handup); } } }); Button rebootVmBtn = (Button)floatView.findViewById(R.id.reboot_vm); rebootVmBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub JSONObject jsonObject = new JSONObject(); try { jsonObject.put("Action", "FapClose"); wConnection.sendTextMessage(new String(new Base64().encode(jsonObject.toString().getBytes()))); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); Button windowCloseBtn = (Button)floatView.findViewById(R.id.window_close); windowCloseBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub CloseConnection(); } }); WindowManager wm = (WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE); WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.type = LayoutParams.TYPE_PHONE; params.format = PixelFormat.RGBA_8888; //params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE; params.flags = LayoutParams.FLAG_NOT_FOCUSABLE; params.gravity = Gravity.CENTER | Gravity.TOP; //params.x = 200; params.y = 0; params.windowAnimations = android.R.style.Animation_InputMethod; Point point = new Point(); wm.getDefaultDisplay().getRealSize(point); params.width = 1000; params.height = 80; params.x = (point.x-params.width) / 2; wm.addView(floatView, params); }ShowSensorBar():
public void ShowSensorBar() { sensor.setVisibility(View.VISIBLE); sensor.setOnHoverListener(new OnHoverListener() { @Override public boolean onHover(View v, MotionEvent event) { final int sensorevent = event.getAction(); if (sensorevent == MotionEvent.ACTION_HOVER_ENTER||sensorevent == MotionEvent.ACTION_HOVER_MOVE) { if(PrintLog.flag) Log.i(TAG, "sensor get Hover and event is "+sensorevent); if(tm == null){ if(PrintLog.flag) Log.i(TAG, "run hover when tm null"); tm = new Timer(); tm.schedule(new TimerTask() { int i = 10; @Override public void run() { if(PrintLog.flag) Log.i(TAG, "run into timer task"); toolBarHandler.post(showtoolbar); tm.cancel(); tm = null; } }, 500); } } if(sensorevent == MotionEvent.ACTION_HOVER_EXIT) { if(tm!=null) { tm.cancel(); tm=null; if(PrintLog.flag) Log.i(TAG, "timer cancel"); } if(hoverinsensor == true){ hoverinsensor=false; if(PrintLog.flag) Log.i("TAG", "1111last hoverintoolbar= " + hoverintoolbar+ " last hoverinsensor= " + hoverinsensor); new Thread(new Runnable() { @Override public void run() { handler.postDelayed(closetoolbar, 1200); } }).start(); } else { if(PrintLog.flag) Log.i("TAG", "hoverinsensor false"); } } return false; } }); WindowManager wm = (WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE); WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.type = LayoutParams.TYPE_PHONE; params.format = PixelFormat.RGBA_8888; //params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE; params.flags = LayoutParams.FLAG_NOT_FOCUSABLE; params.gravity = Gravity.CENTER | Gravity.TOP; //params.x = 200; params.y = 0; params.windowAnimations = android.R.style.Animation_Translucent; Point point = new Point(); wm.getDefaultDisplay().getRealSize(point); params.width = 1000; params.height = 1;//这边一定要小,否则回覆盖FloatBar,导致无法相应按钮 params.x = (point.x-params.width) / 2; wm.addView(sensor, params); }在上述2个方法中有2个线程还有一些参数:
boolean hoverintoolbar; boolean hoverinsensor; boolean hoverinvnclist; boolean hoverinkeystow2; boolean hoverinname_ip; Timer tm; public FloatView sensor; Handler toolBarHandler = new Handler(); final Runnable closetoolbar=new Runnable(){ public void run() { if(!hoverintoolbar&&!hoverinsensor&&!hoverinvnclist&&!hoverinkeystow2&&!hoverinname_ip){ floatView.setVisibility(View.GONE); } } }; final Runnable showtoolbar=new Runnable(){ public void run() { floatView.setVisibility(View.VISIBLE); hoverinsensor=true; handler.removeCallbacks(closetoolbar); } };
相关文章推荐
- 网络仿真NS2之——TCL语言介绍与实践
- AndroidStudio配置指南总结
- 面试题 5
- java传统线程介绍
- java String 两种不同的赋值 比较
- bp神经网络 原理及代码
- 第10、11周项目(3)-警察与厨师
- 简单将集合的内容转为字符串
- Android WebView 开发详解
- 在lua中调用 C模块(以及 multiple Lua VMs detected 错误的解决)
- Java各种常用时间转换
- SAP ABAP如何隐藏你写的程序代码(危险,请小心谨慎)
- Java大数 HDU1042 + 斐波那契数列
- dp题目思路理解 (嵌套镶嵌问题DAG)
- 《 常见算法与数据结构》符号表ST(1)——基本介绍
- Android学习笔记九:SQLiteDatabase中query、insert、update、delete方法参数说明
- Android之shape属性详解
- Apache 配置使用小结
- oracle11gRAC环境使用RMAN备份方案
- ZXActionView简单介绍