今天發現一些軟體可以在android 的案頭上顯示一些浮動小視窗,經過一番尋找,終於找到的解決方案,代碼如下:
FloatingFunc.java
package hrxcframe.comm;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.test.R;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
/**
* 可以永遠顯示在android螢幕最上方的浮動菜單
*
* @author liujl v1.0 需要添加 <uses-permission
* android:name="android.permission.SYSTEM_ALERT_WINDOW"
* /><!--系統快顯視窗許可權-->許可權不然會報錯
*/
public class FloatingFunc {
/**
* 浮動視窗在螢幕中的x座標
*/
private static float x = 0;
/**
* 浮動視窗在螢幕中的y座標
*/
private static float y = 200;
/**
* 螢幕觸摸狀態,暫時未使用
*/
private static float state = 0;
/**
* 滑鼠觸摸開始位置
*/
private static float mTouchStartX = 0;
/**
* 滑鼠觸摸結束位置
*/
private static float mTouchStartY = 0;
/**
* windows 視窗管理器
*/
private static WindowManager wm = null;
/**
* 浮動顯示對象
*/
private static View floatingViewObj = null;
/**
* 參數設定類
*/
public static WindowManager.LayoutParams params = new WindowManager.LayoutParams();
public static int TOOL_BAR_HIGH = 0;
/**
* 要顯示在視窗最前面的對象
*/
private static View view_obj = null;
/**
* 要顯示在視窗最前面的方法
*
* @param context
* 調用對象Context getApplicationContext()
* @param window
* 調用對象 Window getWindow()
* @param floatingViewObj
* 要顯示的浮動物件 View
*/
public static void show(Context context, Window window, View floatingViewObj) {
// 載入xml檔案中樣式例子代碼
// ********************************Start**************************
// LayoutInflater inflater =
// LayoutInflater.from(getApplicationContext());
// View view = inflater.inflate(R.layout.topframe, null);
// wm =
// (WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
// 載入xml檔案中樣式例子代碼
// *********************************End***************************
//
// 關閉浮動顯示對象然後再顯示
close(context);
FloatingFunc.floatingViewObj = floatingViewObj;
view_obj = floatingViewObj;
Rect frame = new Rect();
// 這一句是關鍵,讓其在top 層顯示
// getWindow()
window.getDecorView().getWindowVisibleDisplayFrame(frame);
TOOL_BAR_HIGH = frame.top;
wm = (WindowManager) context// getApplicationContext()
.getSystemService(Activity.WINDOW_SERVICE);
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
| WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
// 設定懸浮視窗長寬資料
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
// 設定透明度
params.alpha = 80;
// 設定內部文字對齊
params.gravity = Gravity.LEFT | Gravity.TOP;
// 以螢幕左上方為原點,設定x、y初始值ֵ
params.x = (int) x;
params.y = (int) y;
// tv = new MyTextView(TopFrame.this);
wm.addView(floatingViewObj, params);
}
/**
* 跟誰滑動移動
*
* @param event
* 事件對象
* @param view
* 彈出對象執行個體(View)
* @return
*/
public static boolean onTouchEvent(MotionEvent event, View view) {
// 擷取相對螢幕的座標,即以螢幕左上方為原點
x = event.getRawX();
y = event.getRawY() - 25; // 25是系統狀態列的高度
Log.i("currP", "currX" + x + "====currY" + y);// 調試資訊
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
state = MotionEvent.ACTION_DOWN;
// panTime();
// 擷取相對View的座標,即以此View左上方為原點
mTouchStartX = event.getX();
mTouchStartY = event.getY();
Log.i("startP", "startX" + mTouchStartX + "====startY"
+ mTouchStartY);// 調試資訊
break;
case MotionEvent.ACTION_MOVE:
state = MotionEvent.ACTION_MOVE;
updateViewPosition(view);
break;
case MotionEvent.ACTION_UP:
state = MotionEvent.ACTION_UP;
updateViewPosition(view);
mTouchStartX = mTouchStartY = 0;
break;
}
return true;
}
/**
* 關閉浮動顯示對象
*/
public static void close(Context context) {
if (view_obj != null && view_obj.isShown()) {
WindowManager wm = (WindowManager) context
.getSystemService(Activity.WINDOW_SERVICE);
wm.removeView(view_obj);
}
}
/**
* 更新快顯視窗位置
*/
private static void updateViewPosition(View view) {
// 更新浮動視窗位置參數
params.x = (int) (x - mTouchStartX);
params.y = (int) (y - mTouchStartY);
wm.updateViewLayout(FloatingFunc.floatingViewObj, params);
}
}
測試代碼,放到任意的 Activity 代碼裡就可以,可以用手拖動位置
final TextView tv = new TextView(getApplicationContext());
tv.setText("http://www.my400800.cn ");
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
FloatingFunc.onTouchEvent(arg1, tv);
return true;
}
});
效果如下:
注意事項:
一定要在AndroidManifest.xml添加
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
系統許可權,不然會出錯的呀。。。。。。。。。。。。。