标签:android 悬浮窗的实现源码 android 悬浮窗的实现源码 自定义view
Android 悬浮窗的实现源码
转载请标明出处:http://blog.csdn.net/pcaxb/article/details/48048529
悬浮窗的实现用到了一个Service、自定义View、Activity
效果图
悬浮窗的实现用到的权限:
<!-- 仿360浮动插件需要的权限 --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="com.android.vending.BILLING" />
在清单文件中注册服务
<service android:name="com.pca.nettraffic.MserServes" />
代码的实现
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 { // 一个有只有一个按钮的activity private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_imitate_widget_main); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub funClick(); } }); } 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的= =这个不是重点 Context c; WindowManager mWM; // WindowManager WindowManager.LayoutParams mWMParams; // WindowManager参数 View win; int tag = 0; int oldOffsetX; int oldOffsetY; public TableShowView(Context context) { // TODO Auto-generated constructor stub super(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() { // 触屏监听 float lastX, 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中设置饿 } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:android 悬浮窗的实现源码 android 悬浮窗的实现源码 自定义view
原文地址:http://blog.csdn.net/pcaxb/article/details/48048529