1. 程式人生 > >可拖動 全域性懸浮框

可拖動 全域性懸浮框

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