全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解android6.0版本下悬浮窗实现

悬浮窗在安卓中实现起来还是比较容易的,这几天在网上温习了相关资料,运行在我安卓6.0手机上才发现,原来在6.0手机上不是行的。

第一反应肯定是权限相关问题,做了相关处理后,果然让悬浮窗原形毕露了。直接贴代码。

public class MainActivity extends AppCompatActivity {
  private static final int ALERT_WINDOW_PERMISSION_CODE = 100;
  private Button start_float;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    start_float = (Button) findViewById(R.id.start_float);
    this.start_float.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        if (Build.VERSION.SDK_INT > 22) {
          sdk23Permission();
        } else {
          startService(new Intent(MainActivity.this, FloatService.class));
          finish();
        }
      }
    });
  }

  /**
   * @description 安卓6.0下权限处理
   * @author ldm
   * @time 2017/3/20 15:00
   */
  public void sdk23Permission() {
    if (!Settings.canDrawOverlays(this)) {
      Toast.makeText(MainActivity.this, "当前无权限使用悬浮窗,请授权!", Toast.LENGTH_SHORT).show();
      Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
          Uri.parse("package:" + getPackageName()));
      startActivityForResult(intent, ALERT_WINDOW_PERMISSION_CODE);
    } else {
      startService(new Intent(MainActivity.this, FloatService.class));
      finish();
    }
  }

  /**
   * 用户返回
   */
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ALERT_WINDOW_PERMISSION_CODE) {
      if (!Settings.canDrawOverlays(this)) {
        Toast.makeText(MainActivity.this, "权限授予失败,无法开启悬浮窗", Toast.LENGTH_SHORT).show();
      } else {
        startService(new Intent(MainActivity.this, FloatService.class));
        finish();
      }

    }
  }
}

对应Service:

public class FloatService extends Service {
  @Nullable
  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }

  @Override
  public void onCreate() {
    FloatViewUtils.getInstance(this).addFloatView();
    super.onCreate();
  }
}

简单地FloatView:

public class FloatView extends View {
  public static final int WIDTH = 150;
  public static final int HEIGHT = 150;
  private Paint circlePaint;
  private Paint textPaint;
  private static final String text = "50%";

  public FloatView(Context context) {
    this(context, null, 0);
  }

  public FloatView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public FloatView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initPaints();
  }

  /**
   * @description 初始化相关画笔Paint
   * @author ldm
   * @time 2017/3/20
   */
  private void initPaints() {
    circlePaint = new Paint();
    circlePaint.setAntiAlias(true);
    circlePaint.setColor(Color.GRAY);
    textPaint = new Paint();
    //设置抗锯齿
    textPaint.setAntiAlias(true);
    //设置字体大小
    textPaint.setTextSize(30);
    //设置颜色
    textPaint.setColor(Color.WHITE);
    //设置(仿)粗体
    textPaint.setFakeBoldText(true);
  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(WIDTH, HEIGHT);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawCircle(WIDTH / 2, HEIGHT / 2, WIDTH / 2, circlePaint);
    float textWidth = textPaint.measureText(text);
    float x = WIDTH / 2 - textWidth / 2;
    Paint.FontMetrics fms = textPaint.getFontMetrics();
    float dy = -(fms.descent + fms.ascent) / 2;
    float y = HEIGHT / 2 + dy;
    canvas.drawText(text, x, y, textPaint);
  }
}

以及FloatView管理工具类:

public class FloatViewUtils {
  private static FloatViewUtils instance;
  private Context mContext;
  private WindowManager manager;
  private FloatView floatView;

  private FloatViewUtils(Context mContext) {
    this.mContext = mContext;
    manager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    floatView = new FloatView(mContext);
  }

  public static FloatViewUtils getInstance(Context mContext) {
    if (null == instance) {
      synchronized (FloatViewUtils.class) {
        if (null == instance) {
          instance = new FloatViewUtils(mContext);
        }
      }
    }
    return instance;
  }

  public void addFloatView() {
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    //悬浮窗口大小
    lp.width = floatView.WIDTH;
    lp.height = floatView.HEIGHT;
    // 调整悬浮窗口位置
    lp.gravity = Gravity.LEFT | Gravity.CENTER;
    // 以屏幕左上角为原点,设置x、y初始值
//    lp.x = 0;
//    lp.y = 0;
    //设置悬浮窗口类型
    lp.type = WindowManager.LayoutParams.TYPE_PHONE;
    //设置悬浮窗口不接受焦点及触摸事件
    lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
    //设置图片格式,效果为背景透明
    lp.format = PixelFormat.RGBA_8888;
    manager.addView(floatView, lp);
  }
}

最后不要忘记在AndroidManifest.xml中添加权限(当然还有注册Service):

复制代码 代码如下:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

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


# android  # 悬浮窗实现  # android实现悬浮窗口  # 安卓6.0悬浮窗  # android 添加随意拖动的桌面悬浮窗口  # Android实现桌面悬浮窗、蒙板效果实例代码  # 不依赖于Activity的Android全局悬浮窗的实现  # Android实现类似360  # QQ管家那样的悬浮窗  # Android 悬浮窗权限各机型各系统适配大全(总结)  # android编程实现悬浮窗体的方法  # Android应用内悬浮窗的实现方案示例  # Android悬浮窗屏蔽悬浮窗外部所有的点击事件的实例代码  # Android中悬浮窗口的实现原理实例分析  # android实现可自由移动、监听点击事件的悬浮窗  # 机上  # 在我  # 原形毕露  # 才发现  # 这几天  # 相关资料  # 不接受  # 比较容易  # 大家多多  # 不要忘记  # 粗体  # 在网上  # 抗锯齿  # author  # ldm  # description  # time  # sdk23Permission  # SDK_INT  # gt 


相关文章: 如何自定义建站之星网站的导航菜单样式?  如何实现建站之星域名转发设置?  制作网页的网站有哪些,电脑上怎么做网页?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  建站主机是否等同于虚拟主机?  PHP正则匹配日期和时间(时间戳转换)的实例代码  实例解析Array和String方法  已有域名建站全流程解析:网站搭建步骤与建站工具选择  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  如何在腾讯云服务器快速搭建个人网站?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  如何用PHP快速搭建CMS系统?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  建站之星安装需要哪些步骤及注意事项?  如何在阿里云虚拟服务器快速搭建网站?  建站主机空间推荐 高性价比配置与快速部署方案解析  建站主机类型有哪些?如何正确选型  如何在Windows服务器上快速搭建网站?  想学网站制作怎么学,建立一个网站要花费多少?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  如何在Tomcat中配置并部署网站项目?  宝塔建站无法访问?如何排查配置与端口问题?  建站之星后台密码如何安全设置与找回?  长沙做网站要多少钱,长沙国安网络怎么样?  如何通过VPS建站实现广告与增值服务盈利?  h5在线制作网站电脑版下载,h5网页制作软件?  建站主机选哪家性价比最高?  建站三合一如何选?哪家性价比更高?  高防服务器租用指南:配置选择与快速部署攻略  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  建站之星如何保障用户数据免受黑客入侵?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  建站ABC备案流程中有哪些关键注意事项?  建站之星如何一键生成手机站?  Python文件管理规范_工程实践说明【指导】  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  如何在万网ECS上快速搭建专属网站?  江苏网站制作公司有哪些,江苏书法考级官方网站?  C#怎么使用委托和事件 C# delegate与event编程方法  建站主机选购指南:核心配置与性价比推荐解析  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  常州企业建站如何选择最佳模板?  深入理解Android中的xmlns:tools属性  智能起名网站制作软件有哪些,制作logo的软件?  高防服务器如何保障网站安全无虞?  建站之星微信建站一键生成小程序+多端营销系统 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。