public classFloatViewService extends Service {private static final String TAG = "FloatViewService";//定义浮动窗口布局

privateLinearLayout mFloatLayout;privateWindowManager.LayoutParams wmParams;//创建浮动窗口设置布局参数的对象

privateWindowManager mWindowManager;privateImageButton mFloatView;private intscreenHeight;private intscreenWidth;privateMyCountDownTimer myCountDownTimer;

@Overridepublic voidonCreate() {

super.onCreate();

Log.i(TAG,"onCreate");

screenHeight= ScreenParam.getInstance().height;//自己写的工具类用来获取屏幕宽高。

screenWidth =ScreenParam.getInstance().width;

createFloatView();

myCountDownTimer= new MyCountDownTimer(2500, 1000); //设置计时2.5s

myCountDownTimer.start();

}

@SuppressWarnings("static-access")

@SuppressLint("InflateParams")private voidcreateFloatView() {

wmParams= newWindowManager.LayoutParams();//通过getApplication获取的是WindowManagerImpl.CompatModeWrapper

mWindowManager =(WindowManager) getApplication().getSystemService(

getApplication().WINDOW_SERVICE);//设置window type

wmParams.type =LayoutParams.TYPE_PHONE;//设置图片格式,效果为背景透明

wmParams.format =PixelFormat.RGBA_8888;//设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)

wmParams.flags =LayoutParams.FLAG_NOT_FOCUSABLE;//调整悬浮窗显示的停靠位置为右侧底部

wmParams.gravity = Gravity.RIGHT |Gravity.BOTTOM;//以屏幕左上角为原点,设置x、y初始值,相对于gravity

wmParams.x = 0;

wmParams.y= 150;//设置悬浮窗口长宽数据

wmParams.width =WindowManager.LayoutParams.WRAP_CONTENT;

wmParams.height=WindowManager.LayoutParams.WRAP_CONTENT;

LayoutInflater inflater= LayoutInflater.from(getApplication());//获取浮动窗口视图所在布局

mFloatLayout =(LinearLayout) inflater.inflate(

R.layout.alert_window_menu,null);//添加mFloatLayout

mWindowManager.addView(mFloatLayout, wmParams);//浮动窗口按钮

mFloatView =(ImageButton) mFloatLayout

.findViewById(R.id.alert_window_imagebtn);

mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,

View.MeasureSpec.UNSPECIFIED), View.MeasureSpec

.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));//设置监听浮动窗口的触摸移动

mFloatView.setOnTouchListener(newOnTouchListener() {

boolean isClick;private intleftDistance;private floatrawX;private floatrawY;

@SuppressLint("ClickableViewAccessibility")

@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {caseMotionEvent.ACTION_DOWN:

mFloatLayout.setAlpha(1.0f);

myCountDownTimer.cancel();取消计时

rawX= event.getRawX();

rawY= event.getRawY();break;caseMotionEvent.ACTION_MOVE://getRawX是触摸位置相对于屏幕的坐标,getX是相对于按钮的坐标

int distanceX = (int) (event.getRawX()-rawX);int distanceY = (int) (event.getRawY()-rawY);

leftDistance= (int) event.getRawX()+ mFloatView.getMeasuredWidth() / 2;

wmParams.x= wmParams.x-distanceX;

wmParams.y= wmParams.y-distanceY;//刷新

mWindowManager.updateViewLayout(mFloatLayout, wmParams);

rawX= event.getRawX();

rawY= event.getRawY();break;caseMotionEvent.ACTION_UP:

myCountDownTimer.start();重新开始计时if(wmParams.x>leftDistance){

wmParams.x= screenWidth-mFloatView.getMeasuredWidth() / 2;

}else{

wmParams.x= 0;

}

mWindowManager.updateViewLayout(mFloatLayout, wmParams);break;

}return false;

}

});

mFloatView.setOnClickListener(newOnClickListener() {

@Overridepublic voidonClick(View v) {

AudioManager audioManager=(AudioManager) getSystemService(Service.AUDIO_SERVICE);

audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,

audioManager.getStreamVolume(AudioManager.STREAM_MUSIC), AudioManager.FLAG_SHOW_UI);//Toast.makeText(FloatViewService.this, "hello!",//Toast.LENGTH_SHORT).show();

}

});

}

@Overridepublic voidonDestroy() {

super.onDestroy();if (mFloatLayout != null) {//移除悬浮窗口

mWindowManager.removeView(mFloatLayout);

}

}

@OverridepublicIBinder onBind(Intent intent) {return null;

}public classMyCountDownTimer extends CountDownTimer {public MyCountDownTimer(long millisInFuture, longcountDownInterval) {

super(millisInFuture, countDownInterval);

}

@Overridepublic void onTick(longmillisUntilFinished) {

}

@Overridepublic voidonFinish() {

mFloatLayout.setAlpha(0.4f);

}

}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐