您的位置:首页 > 移动开发 > Android开发

Android 悬浮窗的实现源码

2015-08-28 10:46 591 查看
Android 悬浮窗的实现源码

转载请标明出处:/article/8162668.html

悬浮窗的实现用到了一个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中设置饿

}

}


源码下载地址:http://download.csdn.net/detail/pcaxb/9057047
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: