您的位置:首页 > 其它

实现悬浮窗口自动吸附到屏幕边缘

2016-05-14 15:12 751 查看
2个View:FloatView SensorView随便继承个View类。FloatView作为悬浮窗显示按钮等等,SensorView使用OnHoverListener接口感知鼠标进入、移除屏幕边缘。

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);

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: