Android开发模仿qq视频通话悬浮按钮(实例代码)
模仿qq视频通话的悬浮按钮的实例代码,如下所示;
publicclassFloatingWindowServiceextendsService{
privatestaticfinalStringTAG="OnTouchListener";
privatestaticViewmView=null;
privatestaticWindowManagermWindowManager=null;
privatestaticContextmContext=null;
publicstaticBooleanisShown=false;
publicWindowManager.LayoutParamsparams=null;
privateintpixel;
privateintTheOffset;
@Override
publicvoidonCreate(){
super.onCreate();
}
@Override
publicintonStartCommand(Intentintent,intflags,intstartId){
pixel=intent.getIntExtra("pixel",1);
showPopupWindow(this);
returnsuper.onStartCommand(intent,flags,startId);
}
/**
*显示弹出框
*
*@paramcontext
*
*/
privatevoidshowPopupWindow(finalContextcontext){
if(isShown){
return;
}
isShown=true;
//获取应用的Context
mContext=context.getApplicationContext();
//获取WindowManager
mWindowManager=(WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
params=newWindowManager.LayoutParams();
mView=setUpView(context);
//类型
params.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
intflags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
params.flags=flags;
params.format=PixelFormat.TRANSLUCENT;
params.width=WindowManager.LayoutParams.WRAP_CONTENT;
params.height=WindowManager.LayoutParams.WRAP_CONTENT;
params.gravity=Gravity.CENTER;
mWindowManager.addView(mView,params);
}
/**
*隐藏弹出框
*/
privatestaticvoidhidePopupWindow(){
if(isShown&&null!=mView){
mWindowManager.removeView(mView);
isShown=false;
}
}
privateintx=0;
privateinty=0;
privateintstartX=0;
privateintstartY=0;
privateViewsetUpView(finalContextcontext){
Viewview=LayoutInflater.from(context).inflate(R.layout.popupwindow,
null);
TextViewtv=(TextView)view.findViewById(R.id.title);
intw=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
inth=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
tv.measure(w,h);
TheOffset=(pixel-tv.getMeasuredWidth())/2-50;
tv.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
Intentintent=newIntent(context,MainActivity.class);
context.startActivity(intent);
//Toast.makeText(context,"点击事件",Toast.LENGTH_LONG).show();
}
});
tv.setOnTouchListener(newView.OnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
switch(event.getAction()){
caseMotionEvent.ACTION_MOVE:
intnewX=(int)(event.getRawX()-x);
intnewY=(int)(event.getRawY()-y);
params.x=newX+startX;
params.y=newY+startY;
mWindowManager.updateViewLayout(mView,params);
break;
caseMotionEvent.ACTION_DOWN:
x=(int)event.getRawX();
y=(int)event.getRawY();
break;
caseMotionEvent.ACTION_UP:
if(params.x>=0){
params.x=TheOffset;
mWindowManager.updateViewLayout(mView,params);
}
if(params.x<=-0){
params.x=-TheOffset;
mWindowManager.updateViewLayout(mView,params);
}
Log.i(TAG,params.x+"");
Log.i(TAG,params.y+"");
//判断从按住到抬起时候的移动距离,如果如果移动距离大于20那么就拦截事件,否则就不拦截事件,主要是处理点击事件的冲突
if(Math.abs(startX-params.x)>20||Math.abs(startY-params.y)>20){
//记录上一次的偏移量
startX=params.x;
startY=params.y;
returntrue;
}else{
startX=params.x;
startY=params.y;
returnfalse;
}
}
returnfalse;
}
});
returnview;
}
@Nullable
@Override
publicIBinderonBind(Intentintent){
returnnull;
}
@Override
publicvoidonDestroy(){
super.onDestroy();
if(mView!=null){
isShown=false;
mWindowManager.removeView(mView);
}
}
}
Main
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.open).setOnClickListener(this);
findViewById(R.id.close).setOnClickListener(this);
}
-点击开启关闭悬浮按钮
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.open:
//判断是否拥有悬浮权限
//op的值是0~47,其中0代表粗略定位权限,1代表精确定位权限,24代表悬浮窗权限。(具体可以看看Android源码在android.app下就有个AppOpsManager类)
if(utils.checkOp(this,24)==0){
Intentintent=newIntent(MainActivity.this,FloatingWindowService.class);
intent.putExtra("pixel",utils.pixel(this)[0]);
startService(intent);
}else{
//引导用户进入悬浮权限设置界面
Intentintent=newIntent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:"+getPackageName()));
startActivityForResult(intent,200);
}
break;
caseR.id.close:
stopService(newIntent(MainActivity.this,FloatingWindowService.class));
break;
}
}
判断权限-获取屏幕的宽高
publicclassutils{
publicstaticintcheckOp(Contextcontext,intop){
finalintversion=Build.VERSION.SDK_INT;
if(version>=19){
Objectobject=context.getSystemService("appops");
Classc=object.getClass();
try{
Class[]cArg=newClass[3];
cArg[0]=int.class;
cArg[1]=int.class;
cArg[2]=String.class;
MethodlMethod=c.getDeclaredMethod("checkOp",cArg);
return(Integer)lMethod.invoke(object,op,Binder.getCallingUid(),context.getPackageName());
}catch(NoSuchMethodExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}catch(IllegalArgumentExceptione){
e.printStackTrace();
}catch(InvocationTargetExceptione){
e.printStackTrace();
}
}
return-1;
}
/**
*获取屏幕的宽高
*@paramcontext
*@return
*/
publicstaticint[]pixel(Activitycontext){
DisplayMetricsdm=newDisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
returnnewint[]{dm.widthPixels,dm.heightPixels};
}
}
--popupwindow填充布局文件
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:id="@+id/popup_window" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/white" android:orientation="vertical"> <TextView android:background="@mipmap/ic_launcher" android:id="@+id/title" android:layout_width="50dp" android:layout_height="50dp"/> </LinearLayout> </LinearLayout>
以上所述是小编给大家介绍的Android开发模仿qq视频通话悬浮按钮(实例代码),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!