Android手机悬浮窗口小案例

本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下

–主页面——–

//布局中就一个Button
public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
   //目的就是启动Service来打开悬浮窗体
    startService(new Intent(MainActivity.this, FloatService.class));
    finish();
   }
  });

 }
}

—Service开启悬浮窗体——-

/**
 * description:通过Service来开启FloatView
 * 作者:ldm
 * 时间:20162016/8/17 14:03
 * 邮箱:1786911211@qq.com
 */
public class FloatService extends Service {
 @Override
 public void onCreate() {
  super.onCreate();
  CustomViewManager.getInstance(this).showFloatViewOnWindow();
 }

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

—悬浮窗体管理工具类——-

/**
 * description:
 * 作者:ldm
 * 时间:20162016/8/17 11:57
 * 邮箱:1786911211@qq.com
 */
public class CustomViewManager {
 //上下文
 private Context mContext;
 //本类实例
 private static CustomViewManager instance;
 //自定义的FloatView
 private FloatView mFloatView;
 //窗口管理类
 private WindowManager mWindowManager;

 private CustomViewManager(Context context) {
  this.mContext = context;
  mFloatView = new FloatView(mContext);
  mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
 }

 /**
  * @param
  * @description 通过单例模式获取实例对象
  * @author ldm
  * @time 2016/8/17 11:59
  */
 public static CustomViewManager getInstance(Context mContext) {
  if (null == instance) {
   synchronized (CustomViewManager.class) {
    if (null == instance) {
     instance = new CustomViewManager(mContext);
    }
   }
  }
  return instance;
 }

 /**
  * @param
  * @description 在手机屏幕上显示自定义的FloatView
  * @author ldm
  * @time 2016/8/17 13:47
  */
 public void showFloatViewOnWindow() {
  WindowManager.LayoutParams parmas = new WindowManager.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/17 11:17
 * 邮箱:1786911211@qq.com
 */
public class FloatView extends View {
 //悬浮球宽度
 private int floatWidth = 150;
 //悬浮球高度
 private int floatHeight = 150;
 //悬浮球画笔
 private Paint mPaint;
 //绘制文字画笔
 private Paint mTextPaint;
 private String text = "50%";

 public FloatView(Context context) {
  super(context);
  initPaint();
 }

 public int getFloatWidth() {
  return floatWidth;
 }

 public int getFloatHeight() {
  return floatHeight;
 }

 public FloatView(Context context, AttributeSet attrs) {
  super(context, attrs);
  initPaint();
 }

 public FloatView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  initPaint();
 }

 /**
  * @param
  * @description 初始化画笔
  * @author ldm
  * @time 2016/8/17 11:37
  */
 private void initPaint() {
  //设置悬浮球画笔
  mPaint = new Paint();
  mPaint.setColor(Color.GREEN);
  mPaint.setAntiAlias(true);
  mPaint.setDither(true);
  //设置文字画笔
  mTextPaint = new Paint();
  mTextPaint.setTextSize(25);
  mPaint.setAntiAlias(true);
  mTextPaint.setColor(Color.WHITE);
  mTextPaint.setFakeBoldText(true);
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  //设置大小
  setMeasuredDimension(floatWidth, floatHeight);
 }

 /**
  * @param
  * @description 绘制图案
  * @author ldm
  * @time 2016/8/17 11:44
  */
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  //绘制悬浮球
  canvas.drawCircle(floatWidth / 2, floatHeight / 2, floatWidth / 2, mPaint);
  //绘制文字
  Paint.FontMetrics metrics = mTextPaint.getFontMetrics();
  //文字大小计算可以参考:http://mikewang.blog.51cto.com/3826268/871765/
  float textWidth = mTextPaint.measureText(text);
  float x = floatWidth / 2 - textWidth / 2;
  float dy = -(metrics.descent + metrics.ascent) / 2;
  float y = floatHeight / 2 + dy;
  canvas.drawText(text, x, y, mTextPaint);
 }
}

最后,在AndroidManifest.xml中不要忘记添加权限:

 <!--添加权限-->
 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

当然也要记得添加Service组件

 <service android:name=".service.FloatService" />

有的手机运行后,发现没有出现我们想要的悬浮窗体,可以进入手机设置中心,点击应用设置,在指定的应用权限设置中打开悬浮窗体相应的设置开关即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现带磁性的悬浮窗体效果

    本文实例讲述了Android实现带磁性的悬浮窗体效果.分享给大家供大家参考,具体如下: 带磁性的悬浮窗体,类似于360绿色小人 主要实现的是: 1.悬浮所有窗体之上 2.有吸引力,吸附于屏幕边上 3.有点击效果 下面我就实现上面三点,简单封装了个FloatView 先看下本次Demo的效果图,然后再看代码, 效果图: FloatView代码如下 package com.manymore13.flowwindowdemo; import android.content.Context; impor

  • Android学习教程之悬浮窗菜单制作(9)

    本文实例为大家分享了Android悬浮窗菜单的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.multilistview; import android.os.Build; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; public class MainActivity extends

  • Android中悬浮窗口的实现原理实例分析

    本文实例讲述了Android中悬浮窗口的实现原理.分享给大家供大家参考.具体如下: 用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下: 调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了.比如创建系统顶级窗口,实现悬浮

  • android编程实现悬浮窗体的方法

    本文实例讲述了android编程实现悬浮窗体的方法.分享给大家供大家参考,具体如下: 突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失.效果图如下: 它的使用原理很简单,就是借用了WindowManager这个管理类来实现的. 1.首先在AndroidManifest.xml中添加使用权限: 复制代码 代码如下: <uses-permission android:name="android.permission

  • Android 悬浮窗权限各机型各系统适配大全(总结)

    这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时. 悬浮窗适配 悬浮窗适配有两种方法:第一种是按照正规的流程,如果系统没有赋予 APP 弹出悬浮窗的权限,就先跳转到权限授权界面,等用户打开该权限之后,再去弹出悬浮窗,比如 QQ 等一些主流应用就是这么做得:第二种就是利用系统的漏洞,绕过权限的申请,简单粗暴,这种方法我不是特别建议,但是现在貌似有些

  • Android自定义覆盖层控件 悬浮窗控件

    在我们移动应用开发过程中,偶尔有可能会接到这种需求: 1.在手机桌面创建一个窗口,类似于360的悬浮窗口,点击这个窗口可以响应(至于窗口拖动我们可以后面再扩展). 2.自己开发的应用去启动一个非本应用B,在B应用的某个界面增加一个引导窗口. 3.在应用的页面上触发启动这个窗口,该窗口悬浮在这个页面上,但又不会影响界面的其他操作.即不像PopupWindow那样要么窗口消失要么页面不可响应 以上需求都有几个共同特点,1.窗口的承载页面不一定不是本应用页面(Activity),即不是类似dialog

  • Android应用内悬浮窗的实现方案示例

    1.悬浮窗的基本介绍 悬浮窗,大家应该也不陌生,凌驾于应用之上的一个小弹窗,实现上很简单,就是添加一个系统级别的窗口,Android中通过WindowManagerService( WMS)来管理所有的窗口,对于WMS来说,管你是Activity.Toast.Dialog,都不过是通过WindowManagerGlobal.addView()添加的一个个View. Android中的窗口分为三个级别: 1.1 应用窗口,比如Activity的窗口; 1.2 子窗口,依赖于父窗口,比如PopupW

  • android 添加随意拖动的桌面悬浮窗口

    用过新版本android 360手机助手都人都对 360中只在桌面显示一个小小悬浮窗口羡慕不已吧? 其实实现这种功能,主要有两步: 1.判断当前显示的是为桌面.这个内容我在前面的帖子里面已经有过介绍,如果还没看过的赶快稳步看一下哦. 2.使用windowManager往最顶层添加一个View .这个知识点就是为本文主要讲解的内容哦.在本文的讲解中,我们还会讲到下面的知识点: a.如果获取到状态栏的高度 b.悬浮窗口的拖动 c.悬浮窗口的点击事件 有开始之前,我们先来看一下效果图:  接下来我们来

  • Android手机悬浮窗口小案例

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 –主页面--– //布局中就一个Button public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

  • Android视频悬浮窗口实现的示例代码

    前言 本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回 APP 页面,通过例子来讲述悬浮窗口实现原理及细节处理,效果图如下所示: 悬浮窗口.gif 原理 WindowManager 对 View 视图进行添加.移除.更新处理: WindowManager.LayoutParams 对窗口参数进行一系列设置. 实现 首先,需要添加相对应悬浮窗权限: <uses-permission android:name="android.permission.SYSTEM_A

  • Android实现触摸移动的悬浮窗口功能

    代码比较简单.不会有详细的讲解,这个功能我之前是用来做实时音视频小窗口悬浮的,所以说最外层是FrameLayout,可以根据自己的需求变成图片,或者功能界面,都可以的. 准备工作:AndroidManifest添加权限 <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /> <uses-permission android:name="android.permis

  • android实现桌面移动悬浮窗口

    现在很多应用都有这样的功能,比如360等安全卫士,手机管家之内的应用. 效果图: 一.实现原理及移动思路 调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了.比如创建系统顶级窗口,实现悬浮窗口效果!然后通过覆写悬浮View中onTouchEvent方法来改变windowManana

  • Android窗口小部件基础编写代码实例

    实现窗口小部件,访问手机储存卡指定目录中的图片文件,然后随机选择一张在窗口的小部件中显示.图片路径使用List存储,适合初级Android学习者参考.本系统无服务,不能保证进程长存. 新建一个空的布局项目,然后新建一个Widget,如图所示: 在新建的xml和java实现类中进行编写即可. picture_widget.xml文件如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&quo

  • android仿华为手机悬浮窗设计

    本文实例为大家分享了android仿华为手机悬浮窗的具体代码,供大家参考,具体内容如下 最近项目中有个需求就是要在android 系统桌面上写一个悬浮球,并使其具有返回,进到主页,打开设置等功能.类似于华为手机的悬浮球.这里主要用到windowManager来实现. 1.先来看看效果图 主页的小圆点 点击小圆点之后展开,然后可以模拟虚拟按键,返回等功能.全局有效. 2.一步步来实现 1.首先这个要常住在桌面,故得写在一个服务里面里面.服务的启动可以通过开机广播,或者在Activity 中启动后直

  • Android组件WebView编写有道词典小案例分享

    最近学习了WebView组件,写了一个有道词典的小案例,分享给大家,供大家参考,具体内容如下 效果图: 源码下载:https://coding.net/u/gxs1225/p/YouDaoDictionary/git 代码如下: 布局 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schema

  • Android开发5:应用程序窗口小部件App Widgets的实现(附demo)

    前言 本次主要是实现一个Android应用,实现静态广播.动态广播两种改变 widget内容的方法,即在上篇博文中实验的基础上进行修改,所以此次实验的重点是AppWidget小部件的实现啦~ 首先,我们简单说一下Widget是一个啥玩意~ 应用程序窗口小部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widget provider来发布一个Widget.可以容纳其它App Widget的应用程序组件被称为App Widge

随机推荐