在平台项目里面做过一个service弹出对话框的功能。这个也差不多。

下面说下这个demo的功能点吧:

1.使用service来弹出此悬浮框,从而保证能长期存在。

2.使用window manager来控制悬浮框漂浮在所有view的上层。参数具体设置见代码。

3.使用TrafficStats来检测网络流量状态。

4.使用ConnectivityManager 来对Wifi,3G等网络状态进行检测。

5.使用handler在线程中异步刷新主界面。

废话不多说了,上代码,一看就明了:

package com.wenix;import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.net.TrafficStats;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;import com.wenix.util.NetworkUtil;public class TopFloatService extends Service {protected static final String TAG = "TopFloatService";protected static final int WHAT = 0x123456;WindowManager wm = null;WindowManager.LayoutParams wmParams = null;View view;ImageView downloadIv;TextView flowTxt;private float mTouchStartX;private float mTouchStartY;private float x;private float y;private String flowInfoStr;private Handler mHandler;@Overridepublic void onCreate() {super.onCreate();// 获取WindowManagerwm = (WindowManager) getApplicationContext().getSystemService("window");// 设置LayoutParams(全局变量)相关参数wmParams = new WindowManager.LayoutParams();// setForeground(true);view = LayoutInflater.from(this).inflate(R.layout.floating, null);downloadIv = (ImageView) view.findViewById(R.id.downloadingImgBtn);flowTxt = (TextView) view.findViewById(R.id.downloadingInfoTxt);new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubwhile (!Thread.interrupted()) {if (NetworkUtil.isNetworkAvailable(getApplicationContext())) {float reciveBytes = TrafficStats.getMobileRxBytes() / 1024.0f;float sendBytes = TrafficStats.getMobileTxBytes() / 1024.0f;String flowInfo = getApplicationContext().getResources().getString(R.string.networkflow);flowInfoStr = String.format(flowInfo, reciveBytes, sendBytes);Log.i(TAG, "reciveBytes=" + reciveBytes + ",sendBytes=" + sendBytes);Message msg = new Message();msg.what = WHAT;mHandler.sendMessage(msg);}}}}).start();mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);if (WHAT == msg.what) {flowTxt.setText(flowInfoStr);}}};}@Overridepublic void onStart(Intent intent, int startId) {// TODO Auto-generated method stubsuper.onStart(intent, startId);createView();}private void createView() {wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;// 该类型提供与用户交互,置于所有应用程序上方,但是在状态栏后面// TYPE_TOAST TYPE_SYSTEM_OVERLAY 在其他应用上层 在通知栏下层 位置不能动鸟// TYPE_PHONE 在其他应用上层 在通知栏下层// TYPE_PRIORITY_PHONE TYPE_SYSTEM_ALERT 在其他应用上层 在通知栏上层 没试出来区别是啥// TYPE_SYSTEM_ERROR 最顶层(通过对比360和天天动听歌词得出)// 用别的TYPE还出报错... 也希望大家补充一下wmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 不接受任何按键事件wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 调整悬浮窗口至左上角// 以屏幕左上角为原点,设置x、y初始值wmParams.x = 0;wmParams.y = 0;// 设置悬浮窗口长宽数据wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;wmParams.format = PixelFormat.RGBA_8888;wm.addView(view, wmParams);view.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {// 获取相对屏幕的坐标,即以屏幕左上角为原点x = event.getRawX();// 25是系统状态栏的高度,也可以通过方法得到准确的值,自己微调就是了y = event.getRawY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 获取相对View的坐标,即以此View左上角为原点mTouchStartX = event.getX();mTouchStartY = event.getY() + view.getHeight() / 2;return false;case MotionEvent.ACTION_MOVE:updateViewPosition();break;case MotionEvent.ACTION_UP:updateViewPosition();mTouchStartX = mTouchStartY = 0;return false;}return true;}});view.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub}});}private void updateViewPosition() {// 更新浮动窗口位置参数wmParams.x = (int) (x - mTouchStartX);wmParams.y = (int) (y - mTouchStartY);wm.updateViewLayout(view, wmParams);}@Overridepublic IBinder onBind(Intent intent) {return null;}
}

工具类:

package com.wenix.util;import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;public class NetworkUtil {private static final String TAG = "NetworkUtil";public static boolean isNetworkAvailable(Context context) {ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);if (connectivity == null) {Log.i("NetWorkState", "Unavailabel");} else {NetworkInfo[] info = connectivity.getAllNetworkInfo();if (info != null) {for (int i = 0; i < info.length; i++) {if (info[i].getState() == NetworkInfo.State.CONNECTED) {Log.i(TAG, info[i].getTypeName() + " Availabel");}}}return true;}return false;}
}

缺点

1是还没有实现控件的事件分离,如onclick,onLongClick,onTouch等事件。

2是流量显示的不精确。

下次再慢慢完善吧。

Android下仿一个优化大师的流量悬浮控件相关推荐

  1. Android下拉刷新上拉加载控件,对所有View通用!

    前面写过一篇关于下拉刷新控件的博客下拉刷新控件终结者:PullToRefreshLayout,后来看到好多人还有上拉加载更多的需求,于是就在前面下拉刷新控件的基础上进行了改进,加了上拉加载的功能.不仅 ...

  2. VC下自制一个MusicPlayer:调用activemovie控件

    步骤如下: 1.打开vc6.0,用AppWizard新建一个project(是exe那个) 2.选择"基于对话框"(第三个选项) 3.一路确定,进入下面的界面:你可以拖动各种控件了 ...

  3. Android 第十八课 强大的滚动控件 RecyclerView

    步骤: 一.添加依赖库 compile'com.android.support:recyclerview-v7:26.1.0' 二.在activity_mian.xml中,添加RecyclerView ...

  4. android 仿qq好友动态,Android UI仿QQ好友列表分组悬浮效果

    本文实例为大家分享了Android UI仿QQ好友列表分组悬浮效果的具体代码,供大家参考,具体内容如下 楼主是在平板上測试的.图片略微有点大,大家看看效果就好 接下来贴源代码: PinnedHeade ...

  5. android悬浮控件-仿360手机助手应用详情页

    最近很少写博客了,今天是2016年的第一天.最近工作中用到了这个悬浮控件.悬浮控件的实现方式有好几种,在这里使用android的事件分发机制来实现的,以及自定义控件的一些常规操作. github地址: ...

  6. android可拖拽悬浮控件和Kotlin的可拖拽悬浮控件/可拖拽悬浮按钮带Demo附件

    本文讲解的是一个实现了可拖拽的悬浮按钮,并添加了吸附边框的功能. 借鉴于:https://www.jianshu.com/p/4f55bcbc1b83 在此之前,先了解下其简单的使用方式吧: 原文地址 ...

  7. android 应用内悬浮,Andorid 应用内悬浮控件实践方案总结

    推荐使用 FloatWindow 库实现悬浮窗,功能全面,链式调用,简洁清爽. 地址 : https://github.com/yhaolpz/FloatWindow 2017/12/30 更新: F ...

  8. Android 应用内悬浮控件实践总结

    推荐使用 FloatWindow 库实现悬浮窗,功能全面,链式调用,简洁清爽. 地址 : https://github.com/yhaolpz/FloatWindow 2017/12/30 更新: F ...

  9. Windows下一个可与其他数据集控件结合的通用的搜索框GUSIconEdit

    当初在两年多前开始做现在这个项目时,我们最初决定花长时间来升级现有的游戏引擎,包括服务器和客户端,我负责了一部分的客户端的功能升级和配套工具集的开发和升级,我们这套引擎的工具集包含工具比较多,每个工具 ...

最新文章

  1. 聊聊flink的ConnectionManager
  2. BigDecimal源码解析
  3. 特斯拉提升安全监控等级,推出“哨兵模式”
  4. JMS学习(2):ActiveMQ简单介绍以及安装
  5. 双目标帕累托优化_多目标稳健性决策规划(MORDM)
  6. MFC/VC++中怎样设置位图按钮并且位图不会覆盖文字——–位图按钮
  7. php中浮点数四舍五入,php浮点数四舍五入函数
  8. Windows Server 2016-批量设置用户下次登陆须更改密码
  9. 嵌入式电路设计(入门)
  10. 关于在Mac上启动了模拟器/连接了手机之后。adb device一直提示List of devices attached的问题...
  11. ubuntu 下 github 使用方法 以及异常修改
  12. Dubbo 生态添新兵,Dubbo Admin 发布 v0.1
  13. 【Django 2021年最新版教程21】数据库查询 model 多条数据 queryset转dict字典 返回渲染到前端
  14. 2021认证杯(小美赛)思路分析
  15. 批量给 Word、Excel、PPT 和 PDF 设置文件保护打开密码和只读密码
  16. 火影 超神V5笔记本键盘维修
  17. 魔兽世界网站服务器搭建,网游服务器搭建方案图解(以魔兽世界为例)(示例代码)...
  18. 腾讯自媒体平台:腾讯QQ看点上线创作中心
  19. 【笔记】火车,航班,车牌号正则表达式(附上测试链接)
  20. SE,SA和RD都代表什么

热门文章

  1. STAR manual
  2. 2011全美最佳最差职业一览:软件工程师居首
  3. SAP:FMALV转OOALV函数及多行多列实现方法
  4. 四层板设计--Layer V.S. Plane
  5. Cycle GAN(复现)---笔记
  6. 【有奖提问】向图灵奖得主、贝叶斯网络之父 Judea Pearl 提问啦
  7. 微信小程序引入iview weapp
  8. 六年之后,我要离开(三)
  9. 阿里云code上添加ssh key
  10. idea mac 查找文件快捷键_mac版idea常用快捷键