FloatService.java 11.1 KB
package com.chudiangameplay.android.service;

import android.annotation.TargetApi;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.chudiangameplay.android.R;
import com.chudiangameplay.android.constant.SPConstants;
import com.chudiangameplay.android.event.Event_Room_RoomChanged;
import com.chudiangameplay.android.interface_.OkHttpCallBack;
import com.chudiangameplay.android.manager.API_RoomManager;
import com.chudiangameplay.android.manager.ChatRoomManager;
import com.chudiangameplay.android.manager.UserManager;
import com.chudiangameplay.android.responce.BaseResponce;
import com.chudiangameplay.android.tool.CommToast;
import com.chudiangameplay.android.tool.Log;
import com.chudiangameplay.android.tool.SPUtil;
import com.chudiangameplay.android.util.GlideUtil;
import com.chudiangameplay.android.util.Util;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;


/**
 * Created by Administrator on 2018/6/20.
 */

public class FloatService extends Service implements View.OnClickListener {
    Context mContext;
    //实例化的WindowManager.
    WindowManager windowManager;

    //悬浮球
    ViewGroup floatBall;
    WindowManager.LayoutParams floatBallParams;

    //状态栏高度
    int statusBarHeight = 0;
    int floatBallX = 0;
    int floatBallY = 0;
    int defaultX = 0;
    int defaultY = 0;

    Handler handler = new Handler();

    @Override
    public void onCreate() {
        super.onCreate();
        EventBus.getDefault().register(this);
        mContext = this;
        statusBarHeight = Util.getStatusBarHeight(this);
        defaultX = Util.dip2px(mContext, 16);
        defaultY = mContext.getResources().getDisplayMetrics().heightPixels - Util.dip2px(mContext, 34 + 72) - statusBarHeight;

        floatBallX = SPUtil.getIntValue(mContext, SPConstants.FloatBallX, defaultX);
        floatBallY = SPUtil.getIntValue(mContext, SPConstants.FloatBallY, defaultY);

        //创建悬浮球
        try {
            createFloatBall();
            bindUI();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i("开启悬浮");
    }

//    @Override
//    public int onStartCommand(Intent intent, int flags, int startId) {
////        Event_Room_RoomChanged event = (Event_Room_RoomChanged) intent.getSerializableExtra("event");
////        try {
////            if (event != null) {
////                tv_roomname.setText("[" + event.roomInfo.roomCategoryName + "]" + event.roomInfo.name);
////                if (!TextUtils.isEmpty(event.roomInfo.currentCompereName)) {
////                    tv_room_no.setText("[主持]  " + event.roomInfo.currentCompereName);
////                } else {
////                    tv_room_no.setText("ID:" + event.roomInfo.roomNo);
////                }
////                GlideUtil.displayImage(mContext, event.roomInfo.icon, iv_room_ico, R.drawable.ico_im_default_head, 100);
////            }
////        } catch (Exception e) {
////
////        }
//        return Service.START_NOT_STICKY;
//    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
        //停止服务,删除悬浮框和悬浮球
        if (floatBall != null) {
            windowManager.removeView(floatBall);
        }
    }

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

    LinearLayout ll_room_float;
    ImageView iv_close_room, iv_room_ico;
    TextView tv_roomname, tv_room_no;

    private void bindUI() {
        try {
            if (ChatRoomManager.getInstance().roomInfo != null) {
                tv_roomname.setText("[" + ChatRoomManager.getInstance().roomInfo.roomCategoryName + "]" + ChatRoomManager.getInstance().roomInfo.name);
                if (ChatRoomManager.getInstance().zhuchiMaiWei != null && ChatRoomManager.getInstance().zhuchiMaiWei.micUser != null) {
                    tv_room_no.setText("[主持]  " + ChatRoomManager.getInstance().zhuchiMaiWei.micUser.nickname);
                } else {
                    tv_room_no.setText("暂无主持");
                }
                GlideUtil.displayImageCompress(mContext, ChatRoomManager.getInstance().roomInfo.icon, iv_room_ico, R.drawable.ico_im_default_head);
            }
        } catch (Exception e) {

        }
    }

    //创建悬浮球
    @TargetApi(Build.VERSION_CODES.O)
    private void createFloatBall() {
        //赋值WindowManager&LayoutParam.
        floatBallParams = new WindowManager.LayoutParams();
        windowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
        //设置type.系统提示型窗口,一般都在应用程序窗口之上.
//        floatBallParams.type = WindowManager.LayoutParams.TYPE_PHONE;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0新特性
            floatBallParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        } else {
            floatBallParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
        }
        //设置效果为背景透明.
        floatBallParams.format = PixelFormat.TRANSLUCENT;
        //设置flags.不可聚焦及不可使用按钮对悬浮窗进行操控.
        floatBallParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

        //设置窗口初始停靠位置.
        floatBallParams.gravity = Gravity.LEFT | Gravity.TOP;
        floatBallParams.x = floatBallX;
        floatBallParams.y = floatBallY;

        //设置悬浮窗口长宽数据.
        floatBallParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
        floatBallParams.height = WindowManager.LayoutParams.WRAP_CONTENT;

        LayoutInflater inflater = LayoutInflater.from(getApplication());
        //获取浮动窗口视图所在布局.
        floatBall = (ViewGroup) inflater.inflate(R.layout.view_floatview, null);
        ll_room_float = floatBall.findViewById(R.id.ll_room_float);
        iv_close_room = floatBall.findViewById(R.id.iv_close_room);
        iv_room_ico = floatBall.findViewById(R.id.iv_room_ico);
        tv_roomname = floatBall.findViewById(R.id.tv_roomname);
        tv_room_no = floatBall.findViewById(R.id.tv_room_no);

        iv_close_room.setOnClickListener(this);
//        ll_room_float.setOnClickListener(this);

        //添加toucherlayout
        windowManager.addView(floatBall, floatBallParams);

        //主动计算出当前View的宽高信息.
        floatBall.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

        floatBall.setOnTouchListener(new View.OnTouchListener() {
            /**相对于View的x、y坐标 **/
            private float xInView, yInView;
            /**在屏幕中的x、y坐标 **/
            private float xDown, yDown;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        xInView = event.getX();
                        yInView = event.getY();
                        xDown = event.getRawX();
                        yDown = event.getRawY() - statusBarHeight;
                        break;

                    case MotionEvent.ACTION_MOVE:
                        //更新悬浮窗位置
                        floatBallParams.x = (int) (event.getRawX() - xInView);
                        floatBallParams.y = (int) (event.getRawY() - yInView - statusBarHeight);
                        windowManager.updateViewLayout(floatBall, floatBallParams);
                        break;

                    case MotionEvent.ACTION_UP:
                        //保存悬浮球位置
                        SPUtil.putValue(mContext, SPConstants.FloatBallX, floatBallParams.x);
                        SPUtil.putValue(mContext, SPConstants.FloatBallY, floatBallParams.y);
                        float moveX = Math.abs(xDown - event.getRawX());
                        float moveY = Math.abs(yDown - event.getRawY() + statusBarHeight);
                        if (moveX < 10 && moveY < 10) {
                            //点击事件
                            getRoomData();
                        } else {
                            floatBall.layout(floatBall.getLeft(), floatBall.getTop(), floatBall.getRight(), floatBall.getBottom());
                        }
                        break;
                }
                return true;
            }
        });
    }

    //获取房间信息
    private void getRoomData() {
        try {
            floatBall.setEnabled(false);
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    floatBall.setEnabled(true);
                }
            }, 2000);

            if (!UserManager.isLogin(mContext)) {
                return;
            }
            if (ChatRoomManager.getInstance().roomInfo == null) {
                return;
            }

            final String roomNo = ChatRoomManager.getInstance().roomInfo.roomNo;
            API_RoomManager.room_enter(mContext, roomNo, "", new OkHttpCallBack() {
                @Override
                public void onSuccess(BaseResponce baseResponce) {
                    if (BaseResponce.Status_Success.equals(baseResponce.status)) {
                        ChatRoomManager.getInstance().joinCharRoom(mContext, roomNo);
                    } else {
                        CommToast.showToast(mContext, baseResponce.msg);
                        ChatRoomManager.getInstance().closeRoom(null);
                    }
                }

                @Override
                public void onFailure(BaseResponce baseResponce) {
                    CommToast.showToast(mContext, "网络请求失败,请重试");
                }
            });
        } catch (Exception e) {

        }
    }

    @Override
    public void onClick(View v) {
        Intent intent;
        switch (v.getId()) {
            case R.id.iv_close_room:
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        floatBall.setEnabled(true);
                    }
                }, 2000);
                ChatRoomManager.getInstance().closeRoom(null);
                break;
        }
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMainThread(Event_Room_RoomChanged event) {
        //// 0 创建, 1 销毁   2 隐藏  3 显示
        Log.i("event:" + event.type);
        if (event.type == 2) {
            floatBall.setVisibility(View.GONE);
        } else if (event.type == 3) {
            floatBall.setVisibility(View.VISIBLE);
        } else if (event.type == 0) {
            bindUI();
        }
    }
}