android 带磁性的悬浮窗体

http://blog.csdn.net/manymore13/article/details/8577286

带磁性的悬浮窗体,类似于360绿色小人

主要实现的是:

1.悬浮所有窗体之上

2.有吸引力,吸附于屏幕边上

3.有点击效果

下面我就实现上面三点,简单封装了个FloatView 

先看下本次Demo的效果图,然后再看代码,

效果图:

FloatView代码如下

package com.manymore13.flowwindowdemo;

import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.ImageView;

/**
 * @author manymore13
 * @Blog <a href="http://blog.csdn.net/manymore13">http://blog.csdn.net/manymore13</a>
 * @version 1.0
 */
public class FloatView extends ImageView{

	private float mTouchX;
	private float mTouchY;
	private float x;
	private float y;
	private int startX;
	private int startY;
	private Context c;
	private int imgId = R.drawable.ic_launcher;
	private int controlledSpace = 20;
	private int screenWidth;
	boolean isShow = false;
	private OnClickListener mClickListener;

	private WindowManager windowManager ;

	private WindowManager.LayoutParams windowManagerParams = new WindowManager.LayoutParams();

	public FloatView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public FloatView(Context c)
	{
		super(c);
		initView(c);
	}
	// 初始化窗体
	public void initView(Context c)
	{
		windowManager = (WindowManager) c.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
		screenWidth = windowManager.getDefaultDisplay().getWidth();
		this.setImageResource(imgId);
		windowManagerParams.type = LayoutParams.TYPE_PHONE;
		windowManagerParams.format = PixelFormat.RGBA_8888;	// 背景透明
		windowManagerParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
				| LayoutParams.FLAG_NOT_FOCUSABLE;
		// 调整悬浮窗口至左上角,便于调整坐标
		windowManagerParams.gravity = Gravity.LEFT | Gravity.TOP;
		// 以屏幕左上角为原点,设置x、y初始值
		windowManagerParams.x = 0;
		windowManagerParams.y = 200;
		// 设置悬浮窗口长宽数据
		windowManagerParams.width = LayoutParams.WRAP_CONTENT;
		windowManagerParams.height = LayoutParams.WRAP_CONTENT;

	}

	public void setImgResource(int id)
	{
		imgId = id;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {

		x = event.getRawX();
		y = event.getRawY();

		switch(event.getAction())
		{
			case MotionEvent.ACTION_DOWN:
			{
				mTouchX = event.getX();
				mTouchY = event.getY();
				startX = (int) event.getRawX();
				startY = (int) event.getRawY();
				break;

			}
			case MotionEvent.ACTION_MOVE:
			{
				updateViewPosition();
				break;
			}
			case MotionEvent.ACTION_UP:
			{

				if(Math.abs(x - startX) < controlledSpace && Math.abs(y - startY) < controlledSpace)
				{
					if(mClickListener != null)
					{
						mClickListener.onClick(this);
					}
				}
				Log.i("tag", "x="+x+" startX+"+startX+" y="+y+" startY="+startY);
				if(x <= screenWidth/2)
				{
					x = 0;
				}else{
					x = screenWidth;
				}

				updateViewPosition();

				break;
			}
		}

		return super.onTouchEvent(event);
	}

	// 隐藏该窗体
	public void hide()
	{
		if(isShow)
		{
			windowManager.removeView(this);
			isShow = false;
		}

	}

	// 显示该窗体
	public void show()
	{
		if(isShow == false)
		{
			windowManager.addView(this, windowManagerParams);
			isShow = true;
		}

	}

	@Override
    public void setOnClickListener(OnClickListener l) {
         this.mClickListener = l;
    }

    private void updateViewPosition() {
         // 更新浮动窗口位置参数
	     windowManagerParams.x = (int) (x - mTouchX);
	     windowManagerParams.y = (int) (y - mTouchY);
	     windowManager.updateViewLayout(this, windowManagerParams); // 刷新显示
    }
}

如果需要用上面的类可以这样做

floatView = new FloatView(this); // 创建窗体

floatView.setOnClickListener(this); // 设置事件,你需要实现FloatView里的onclick接口

floatView.show();  // 显示该窗体

floatView.hide();  // 隐藏窗体

PS 
不要忘记在manifest里加上权限  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

时间: 2024-08-01 03:43:03

android 带磁性的悬浮窗体的相关文章

Android实现带磁性的悬浮窗体效果

本文实例讲述了Android实现带磁性的悬浮窗体效果.分享给大家供大家参考,具体如下: 带磁性的悬浮窗体,类似于360绿色小人 主要实现的是: 1.悬浮所有窗体之上 2.有吸引力,吸附于屏幕边上 3.有点击效果 下面我就实现上面三点,简单封装了个FloatView 先看下本次Demo的效果图,然后再看代码, 效果图: FloatView代码如下 package com.manymore13.flowwindowdemo; import android.content.Context; impor

android编程实现悬浮窗体的方法_Android

本文实例讲述了android编程实现悬浮窗体的方法.分享给大家供大家参考,具体如下: 突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失.效果图如下: 它的使用原理很简单,就是借用了WindowManager这个管理类来实现的. 1.首先在AndroidManifest.xml中添加使用权限: 复制代码 代码如下: <uses-permission android:name="android.permission

android编程实现悬浮窗体的方法

本文实例讲述了android编程实现悬浮窗体的方法.分享给大家供大家参考,具体如下: 突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失.效果图如下: 它的使用原理很简单,就是借用了WindowManager这个管理类来实现的. 1.首先在AndroidManifest.xml中添加使用权限: 复制代码 代码如下:<uses-permission android:name="android.permission.

Android带多选功能的PhotoPicker

最近利用闲碎的一些时间开发了一个Android库PhotoPicker,前面一篇文章也介绍了,Android高仿微信图片选择功能的PhotoPicker,之前没有加入选择多张图片的功能,现在加上之后一个完整的PhotoPicker库终于算是完工了. 动态效果图 Android带多选功能的PhotoPicker示例图片 使用方法 引入PhotoPicker库,在需要使用图片选择功能的地方添加如下代码: Intent intent = new Intent(MainActivity.this, Ph

Android带进度的圆形进度条_Android

我们还是用一个小例子来看看自定义View和自定义属性的使用,带大家来自己定义一个带进度的圆形进度条,我们还是先看一下效果吧 从上面可以看出,我们可以自定义圆环的颜色,圆环进度的颜色,是否显示进度的百分比,进度百分比的颜色,以及进度是实心还是空心等等,这样子是不是很多元化很方便呢?接下来我们就来教大家怎么来定义 1.在values下面新建一个attrs.xml,现在里面定义我们的属性,不同的属性对应不同的format,接下来我贴上我在自定义这个进度条所用到的属性 <?xml version="

android悬浮窗-android写了一个悬浮窗,但是输入法显示不出来了,希望能得到朋友们的帮助,谢谢了。

问题描述 android写了一个悬浮窗,但是输入法显示不出来了,希望能得到朋友们的帮助,谢谢了. 用android编写了悬浮窗,项目是用Unity3d做的,项目中的输入法软键盘无法显示了,能接收到按键,但是软键盘看不到. windowParams的参数如下,主要的问题在flags windowParams.type = LayoutParams.TYPE_PHONE; windowParams.format = PixelFormat.RGBA_8888; windowParams.flags

Android使用WindowManager构造悬浮view_Android

一般在android显示一个View都是通过Activity的setContentView设置的,但是还有一种方法,可以直接使用WindowManager在整个应用的最上层绘制我们需要显示的view,总体的效果类似于AlertDialog的弹出效果. 使用WindowManager构造这样的一个悬浮View也比较简单,直接通过windowmanager.addView()方法即可. package com.gearmotion.app.windowmanagermotion; import an

阿里云王坚:谷歌正将开放的Android带向封闭

[http://www.aliyun.com/zixun/aggregation/11613.html">中国企业家网] 继阿里集团发文回应阿里云OS和谷歌Android的争议后,阿里巴巴集团CTO.阿里云总裁王坚博士于9月18日以公开信的方式进行回应:自己和阿里云的同事对谷歌的行为感到非常遗憾,认为谷歌已经变了,将开放的 Android 变成了需要谷歌许可的"Google OS",且完全为谷歌自身利益服务.他认为谷歌正在将开放的 Android 带向封闭的方向. 王坚

Android带进度的圆形进度条

我们还是用一个小例子来看看自定义View和自定义属性的使用,带大家来自己定义一个带进度的圆形进度条,我们还是先看一下效果吧 从上面可以看出,我们可以自定义圆环的颜色,圆环进度的颜色,是否显示进度的百分比,进度百分比的颜色,以及进度是实心还是空心等等,这样子是不是很多元化很方便呢?接下来我们就来教大家怎么来定义 1.在values下面新建一个attrs.xml,现在里面定义我们的属性,不同的属性对应不同的format,接下来我贴上我在自定义这个进度条所用到的属性 <?xml version="