Android 悬浮窗的实现源码

转载请标明出处:http://blog.csdn.net/pcaxb/article/details/48048529

悬浮窗的实现用到了一个Service、自定义View、Activity

效果图


悬浮窗的实现用到的权限:

            


在清单文件中注册服务


代码的实现

1.Activity的源码

package com.pca.nettraffic;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class WidgetMainActivity extends Activity {// 一个有只有一个按钮的activityprivate Button btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_imitate_widget_main);btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubfunClick();}});}public void funClick() {// 按钮被点击this.startService(new Intent(getApplicationContext(), MserServes.class));// new TableShowView(this).fun(); 如果只是在activity中启动// 当activity跑去后台的时候[暂停态,或者销毁态] 我们设置的显示到桌面的view也会消失// 所以这里采用的是启动一个服务,服务中创建我们需要显示到table上的view,并将其注册到windowManager上this.finish();}}

2.Service源码

package com.pca.nettraffic;import android.app.Service;import android.content.Intent;import android.os.IBinder;public class MserServes extends Service {   //服务      //这个类纯蛋疼用 只是为了在activity点击button后 在开启一个service             @Override      public IBinder onBind(Intent intent) {          // TODO Auto-generated method stub          return null;      }        public void onCreate() {      //创建service时一个 实例化一个TableShowView对象并且调用他的fun()方法把它注册到windowManager上          super.onCreate();          new TableShowView(getApplicationContext()).fun();          System.out.println("开启Mser服务......");    }          @Override      public int onStartCommand(Intent intent, int flags, int startId) {          // TODO Auto-generated method stub          return super.onStartCommand(intent, flags, startId);      }  }  

3.自定义View源码(TableShowView extends View)

package com.pca.nettraffic;import android.content.Context;import android.graphics.Color;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;import android.widget.Toast;public class TableShowView extends View {// 如果是想显示歌词则继承TextView并复写ondraw方法。// 开启一个线程不断的调用ondraw方法去更改你所写的继承自TextView的内容// 这里随便写了个集成自view的= =这个不是重点Contextc;WindowManagermWM;// WindowManagerWindowManager.LayoutParamsmWMParams;// WindowManager参数Viewwin;int tag = 0;int oldOffsetX;int oldOffsetY;public TableShowView(Context context) {// TODO Auto-generated constructor stubsuper(context);c = context;}public void fun() {// 设置载入view WindowManager参数mWM = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE);win = LayoutInflater.from(c).inflate(R.layout.activity_imitate_widget_ctrl_window, null);win.setBackgroundColor(Color.TRANSPARENT);// 这里是随便载入的一个布局文件win.setOnTouchListener(new OnTouchListener() {// 触屏监听floatlastX, lastY;public boolean onTouch(View v, MotionEvent event) {final int action = event.getAction();float x = event.getX();float y = event.getY();if(tag == 0){   oldOffsetX= mWMParams.x; // 偏移量   oldOffsetY = mWMParams.y; // 偏移量}    if (action == MotionEvent.ACTION_DOWN) {lastX = x;lastY = y;}else if (action == MotionEvent.ACTION_MOVE) {mWMParams.x += (int) (x - lastX); // 偏移量mWMParams.y += (int) (y - lastY); // 偏移量tag = 1;mWM.updateViewLayout(win, mWMParams);}else if (action ==  MotionEvent.ACTION_UP){int newOffsetX = mWMParams.x;int newOffsetY = mWMParams.y;if(oldOffsetX == newOffsetX && oldOffsetY == newOffsetY){Toast.makeText(c, "你点到我了……疼!!!!", 1).show();}else {tag = 0;}}return true;}});WindowManager wm = mWM;WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();mWMParams = wmParams;wmParams.type = 2002; // type是关键,这里的2002表示系统级窗口,你也可以试试2003。wmParams.flags = 40;// 这句设置桌面可控wmParams.width = 50;wmParams.height = 50;wmParams.format = -3; // 透明wm.addView(win, wmParams);// 这句是重点 给WindowManager中丢入刚才设置的值// 只有addview后才能显示到页面上去。// 注册到WindowManager win是要刚才随便载入的layout,wmParams是刚才设置的WindowManager参数集// 效果是将win注册到WindowManager中并且它的参数是wmParams中设置饿}}

源码下载地址:http://download.csdn.net/detail/pcaxb/9057047


更多相关文章

  1. Android——RecyclerView——Recycler类全部源码翻译及注释
  2. android attr.xml 怎么在主工程中设置library项目中背景或者其他
  3. Android保存图片到相册
  4. Android(安卓)InputMethod 源码分析,显示输入法流程
  5. Android(安卓)new Message()和Message.obtainMessage的区别
  6. Android用户界面程序设计示例
  7. Android(安卓)init进程——解析配置文件
  8. android 在源码中编译工程的方法
  9. Android学习笔记--service部分

随机推荐

  1. 自定义Android视频播放器 - 自定义Surfac
  2. 在android中通过gps wifi定位位置
  3. android柱状图和饼状图的的实现
  4. Android使用广播(BroadCast)实现强制下线
  5. Android(安卓)Studio添加so文件并打包到A
  6. Android(安卓)Studio集成友盟SDK出现的问
  7. android系统执行命令权限问题(permission
  8. Android(安卓)学习论坛博客及网站推荐(102
  9. Android(安卓)4.4从图库选择图片,获取图
  10. Android(安卓)listview 实现列表多选