android 悬浮球 (所有界面可用) 开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/engineer_james/article/details/82024041

创建 service 后台启动

public class FBService extends Service {

    private static final String TAG = "FBService";
    public static final int TYPE_ADD = 0;
    public static final int TYPE_DEL = 1;
    private FloatBallManager mFBManager;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"onCreate");
        mFBManager = FloatBallManager.getInstance(this);
    }


    private void showFloatBall() {
        Log.d(TAG,"showFloatBall");
        mFBManager.addBallView(); //通过mFBManager 在windowmanager添加view 
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG,"onStartCommand");showFloatBall(intent);
        showFloatBall();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestroy");

    }
}

通过FloatBallManager 在windowmanager 加载 悬浮球布局

public class FloatBallManager {
    private static final String TAG = "FloatBallManager";

    private FloatBallManager(Context ctx){
        mCtx = ctx;
        mWindowManager = (WindowManager) mCtx.getSystemService(Context.WINDOW_SERVICE);
        //获取WindowManager 
    }

    public static  FloatBallManager getInstance(Context ctx){
        if(instance == null){
            synchronized(FloatBallManager.class){
                if(instance == null){
                    instance = new FloatBallManager(ctx);
                }
            }
        }
        return instance;
    }

    public void addBallView() {
        if (mFloatBallView == null) {
        //获取 整个手机的宽度和高度
            DisplayMetrics dm = new DisplayMetrics();
            mWindowManager.getDefaultDisplay().getMetrics(dm);
            mScreenWidth = dm.widthPixels;
            mScreenHeight = dm.heightPixels;
            //填充悬浮球 布局
            mFBWindow = LayoutInflater.from(mCtx).inflate(R.layout.float_ball, null);
            mFloatBallView = mFBWindow.findViewById(R.id.float_ball);
            mFBParams = new LayoutParams(); //设置悬浮球布局的参数
            mFBParams.x = mScreenWidth-mFloatBallView.getWidth(); 
            mFBParams.y = mScreenHeight / 2;
            mFBParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
            mFBParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
            mFBParams.gravity = Gravity.LEFT | Gravity.TOP;
            mFBParams.type = LayoutParams.TYPE_SYSTEM_ALERT | LayoutParams.TYPE_SYSTEM_OVERLAY;//顶层的View ,就要用这两个type 
            mFBParams.format = PixelFormat.TRANSLUCENT;//半透明
            mFBParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE;//设置没有焦点不能touch,这样其他的界面才可以滑动和操作
            mWindowManager.addView(mFBWindow, mFBParams);
            //将View 按照mFBParams参数设置,添加到mWindowManager ,mFBParams是告诉mFBWindow 的父view
        }
    }

    //这个方法用来拖动时使用,更新位置
    public void updateBallView(int deltaX,int deltaY) {
        mFBParams.x += deltaX;
        mFBParams.y += deltaY;
        if (mWindowManager != null) {
//            Log.d(TAG,"updateBallView mParams.x = "+mFBParams.x+" mParams.y = "+mFBParams.y);
            mWindowManager.updateViewLayout(mFBWindow, mFBParams);
        }
    }
}

悬浮球布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fl_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:orientation="vertical">
    <!--悬浮球背景-->
        <ImageView
            android:id="@+id/img_bg"  
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleX="0.7"
            android:scaleY="0.7"
            android:background="@drawable/icon_bg"
            android:layout_gravity="center"/>
    <!--悬浮球动画小球-->
        <ImageView
            android:id="@+id/img_ball"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:alpha="0.5"
            android:scaleX="0.7"
            android:scaleY="0.7"
            android:background="@drawable/icon_ball"/>
    <!--悬浮球动画大球-->
        <ImageView
            android:id="@+id/img_big_ball"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:scaleX="0.7"
            android:scaleY="0.7"
            android:background="@drawable/icon_big_ball"
            android:visibility="invisible"
            />
       <!--悬浮球开关 默认是off-->
        <TextView
            android:id="@+id/tv_switch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/switch_off"/>
</FrameLayout>

以上一个悬浮球 就可以显示了,但是不能操作

完整代码


猜你喜欢

转载自blog.csdn.net/engineer_james/article/details/82024041