可拖動 全域性懸浮框
阿新 • • 發佈:2018-12-27
Android手機內的全域性懸浮框,可拖動。而且不需要系統許可權!下面的是主要程式碼:
package cn.net.owen.floatview;
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
/**
*
*/
public class FloatViewService extends Service implements View.OnTouchListener{
private String TAG = "FloatViewService";
private float mTouchStartX;
private float mTouchStartY;
private float x;
private float y;
//定義浮動窗口布局
FrameLayout mFloatLayout;
WindowManager.LayoutParams wmParams;
//建立浮動視窗設定佈局引數的物件
WindowManager mWindowManager;
public FloatViewService() {
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented" );
}
@Override
public void onCreate() {
super.onCreate();
createFloatView();
}
@Override
public void onDestroy() {
super.onDestroy();
if (mFloatLayout != null) {
mWindowManager.removeView(mFloatLayout);
}
}
private void createFloatView() {
wmParams = new WindowManager.LayoutParams();
mWindowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE);
wmParams.type = WindowManager.LayoutParams.TYPE_TOAST;
//設定圖片格式,效果為背景透明
wmParams.format = PixelFormat.RGBA_8888;
//設定浮動視窗不可聚焦(實現操作除浮動視窗外的其他可見視窗的操作)
wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
wmParams.format = PixelFormat.TRANSLUCENT;
//調整懸浮窗顯示的停靠位置為左側置頂
wmParams.gravity = Gravity.LEFT | Gravity.TOP;
// 以螢幕左上角為原點,設定x、y初始值
wmParams.x = 500;
wmParams.y =800;
//設定懸浮視窗長寬資料
wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
LayoutInflater inflater = LayoutInflater.from(getApplication());
//獲取浮動視窗檢視所在佈局
mFloatLayout = (FrameLayout) inflater.inflate(R.layout.float_view, null);
//新增mFloatLayout
mWindowManager.addView(mFloatLayout, wmParams);
//浮動視窗按鈕
mFloatLayout.setOnTouchListener(this);
mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
}
private float StartX;
private float StartY;
@Override
public boolean onTouch(View v, MotionEvent event) {
//獲取相對螢幕的座標,即以螢幕左上角為原點
x = event.getRawX();
y = event.getRawY() - 25; //25是系統狀態列的高度
Log.i("currP", "currX" + x + "====currY" + y);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//獲取相對View的座標,即以此View左上角為原點
mTouchStartX = event.getX();
mTouchStartY = event.getY();
StartX = x;
StartY = y;
Log.i("startP", "startX" + mTouchStartX + "====startY" + mTouchStartY);
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(x - StartX) > 5 && Math.abs(y - StartY) > 5) {
updateViewPosition();
}
break;
case MotionEvent.ACTION_UP:
if (Math.abs(x - StartX) > 5 && Math.abs(y - StartY) > 5) {
updateViewPosition();
mTouchStartX = mTouchStartY = 0;
}
break;
}
return true;
}
private void updateViewPosition() {
//更新浮動視窗位置引數
wmParams.x = (int) (x - mTouchStartX);
wmParams.y = (int) (y - mTouchStartY);
mWindowManager.updateViewLayout(mFloatLayout, wmParams);
}
}
如果只想在單個應用內全域性執行,可以在退出應用時停止服務執行。
package cn.net.owen.floatview;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this,FloatViewService.class));
}
@Override
protected void onDestroy() {
super.onDestroy();
// stopService(new Intent(this,FloatViewService.class));
}
}