android悬浮窗组件,Android 悬浮窗的实现源码

Android 悬浮窗的实现源码

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

效果图

0818b9ca8b590ca3270a3433284dd417.png

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

在清单文件中注册服务

代码的实现

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的= =这个不是重点

Contextc;

WindowManagermWM;// WindowManager

WindowManager.LayoutParamsmWMParams;// WindowManager参数

Viewwin;

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() {

// 触屏监听

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中设置饿

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值