Android手机悬浮窗口小案例
本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下
–主页面——–
//布局中就一个Button
publicclassMainActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn).setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewview){
//目的就是启动Service来打开悬浮窗体
startService(newIntent(MainActivity.this,FloatService.class));
finish();
}
});
}
}
—Service开启悬浮窗体——-
/**
*description:通过Service来开启FloatView
*作者:ldm
*时间:20162016/8/1714:03
*邮箱:1786911211@qq.com
*/
publicclassFloatServiceextendsService{
@Override
publicvoidonCreate(){
super.onCreate();
CustomViewManager.getInstance(this).showFloatViewOnWindow();
}
@Override
publicIBinderonBind(Intentintent){
returnnull;
}
}
—悬浮窗体管理工具类——-
/**
*description:
*作者:ldm
*时间:20162016/8/1711:57
*邮箱:1786911211@qq.com
*/
publicclassCustomViewManager{
//上下文
privateContextmContext;
//本类实例
privatestaticCustomViewManagerinstance;
//自定义的FloatView
privateFloatViewmFloatView;
//窗口管理类
privateWindowManagermWindowManager;
privateCustomViewManager(Contextcontext){
this.mContext=context;
mFloatView=newFloatView(mContext);
mWindowManager=(WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
}
/**
*@param
*@description通过单例模式获取实例对象
*@authorldm
*@time2016/8/1711:59
*/
publicstaticCustomViewManagergetInstance(ContextmContext){
if(null==instance){
synchronized(CustomViewManager.class){
if(null==instance){
instance=newCustomViewManager(mContext);
}
}
}
returninstance;
}
/**
*@param
*@description在手机屏幕上显示自定义的FloatView
*@authorldm
*@time2016/8/1713:47
*/
publicvoidshowFloatViewOnWindow(){
WindowManager.LayoutParamsparmas=newWindowManager.LayoutParams();
parmas.width=mFloatView.getFloatWidth();
parmas.height=mFloatView.getFloatHeight();
//窗口图案放置位置
parmas.gravity=Gravity.LEFT|Gravity.CENTER;
//如果忽略gravity属性,那么它表示窗口的绝对X位置。
parmas.x=0;
//如果忽略gravity属性,那么它表示窗口的绝对Y位置。
parmas.y=0;
////电话窗口。它用于电话交互(特别是呼入)。它置于所有应用程序之上,状态栏之下。
parmas.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
//FLAG_NOT_FOCUSABLE让window不能获得焦点,这样用户快就不能向该window发送按键事件及按钮事件
//FLAG_NOT_TOUCH_MODAL即使在该window在可获得焦点情况下,仍然把该window之外的任何event发送到该window之后的其他window.
parmas.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
//期望的位图格式。默认为不透明。参考android.graphics.PixelFormat。
parmas.format=PixelFormat.RGBA_8888;
mWindowManager.addView(mFloatView,parmas);
}
}
—自定义的FloatView——-
/**
*description:
*作者:ldm
*时间:20162016/8/1711:17
*邮箱:1786911211@qq.com
*/
publicclassFloatViewextendsView{
//悬浮球宽度
privateintfloatWidth=150;
//悬浮球高度
privateintfloatHeight=150;
//悬浮球画笔
privatePaintmPaint;
//绘制文字画笔
privatePaintmTextPaint;
privateStringtext="50%";
publicFloatView(Contextcontext){
super(context);
initPaint();
}
publicintgetFloatWidth(){
returnfloatWidth;
}
publicintgetFloatHeight(){
returnfloatHeight;
}
publicFloatView(Contextcontext,AttributeSetattrs){
super(context,attrs);
initPaint();
}
publicFloatView(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
initPaint();
}
/**
*@param
*@description初始化画笔
*@authorldm
*@time2016/8/1711:37
*/
privatevoidinitPaint(){
//设置悬浮球画笔
mPaint=newPaint();
mPaint.setColor(Color.GREEN);
mPaint.setAntiAlias(true);
mPaint.setDither(true);
//设置文字画笔
mTextPaint=newPaint();
mTextPaint.setTextSize(25);
mPaint.setAntiAlias(true);
mTextPaint.setColor(Color.WHITE);
mTextPaint.setFakeBoldText(true);
}
@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
//设置大小
setMeasuredDimension(floatWidth,floatHeight);
}
/**
*@param
*@description绘制图案
*@authorldm
*@time2016/8/1711:44
*/
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
//绘制悬浮球
canvas.drawCircle(floatWidth/2,floatHeight/2,floatWidth/2,mPaint);
//绘制文字
Paint.FontMetricsmetrics=mTextPaint.getFontMetrics();
//文字大小计算可以参考:http://mikewang.blog.51cto.com/3826268/871765/
floattextWidth=mTextPaint.measureText(text);
floatx=floatWidth/2-textWidth/2;
floatdy=-(metrics.descent+metrics.ascent)/2;
floaty=floatHeight/2+dy;
canvas.drawText(text,x,y,mTextPaint);
}
}
最后,在AndroidManifest.xml中不要忘记添加权限:
<!--添加权限--> <uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/>
当然也要记得添加Service组件
<serviceandroid:name=".service.FloatService"/>
有的手机运行后,发现没有出现我们想要的悬浮窗体,可以进入手机设置中心,点击应用设置,在指定的应用权限设置中打开悬浮窗体相应的设置开关即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。