`
whotodo
  • 浏览: 168074 次
文章分类
社区版块
存档分类
最新评论

android 悬浮窗口的拖动

 
阅读更多

最近看了一篇博文帮助挺大,我想好多学习android 的人都看过,转过来做个本备份。

package net.xsmile.fv;


import android.app.Application;
import android.view.WindowManager;


public class MyApplication extends Application {
	
	/**
	 * 创建全局变量
	 * 全局变量一般都比较倾向于创建一个单独的数据类文件,并使用static静态变量
	 * 
	 * 这里使用了在Application中添加数据的方法实现全局变量
	 * 注意在AndroidManifest.xml中的Application节点添加android:name=".MyApplication"属性
	 * 
	 */
	private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();


	public WindowManager.LayoutParams getMywmParams(){
		return wmParams;
	}
}

package net.xsmile.fv;

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.ImageView;

public class MyFloatView extends ImageView {
	private float mTouchStartX;
    private float mTouchStartY;
    private float x;
    private float y;
    
    
    private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService("window");
    
    //此wmParams为获取的全局变量,用以保存悬浮窗口的属性
    private WindowManager.LayoutParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams();

	public MyFloatView(Context context) {
		super(context);		
		// TODO Auto-generated constructor stub
	}
	
	 @Override
	 public boolean onTouchEvent(MotionEvent event) {
		 
		 
		 //获取相对屏幕的坐标,即以屏幕左上角为原点		 
	     x = event.getRawX();   
	     y = event.getRawY()-25;   //25是系统状态栏的高度
	     Log.i("currP", "currX"+x+"====currY"+y);
	     switch (event.getAction()) {
	        case MotionEvent.ACTION_DOWN:
	        	//获取相对View的坐标,即以此View左上角为原点
	        	mTouchStartX =  event.getX();  
                mTouchStartY =  event.getY();
                
	            Log.i("startP", "startX"+mTouchStartX+"====startY"+mTouchStartY);
	            
	            break;
	        case MotionEvent.ACTION_MOVE:	            
	            updateViewPosition();
	            break;

	        case MotionEvent.ACTION_UP:
	        	updateViewPosition();
	        	mTouchStartX=mTouchStartY=0;
	        	break;
	        }
	        return true;
		}
	 
	 private void updateViewPosition(){
		//更新浮动窗口位置参数
		wmParams.x=(int)( x-mTouchStartX);
		wmParams.y=(int) (y-mTouchStartY);
	    wm.updateViewLayout(this, wmParams);
	    
	 }

}

package net.xsmile.fv;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.Gravity;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;

public class MyFloatViewActivity extends Activity {
    /** Called when the activity is first created. */
	
	private WindowManager wm=null;
	private WindowManager.LayoutParams wmParams=null;
	
	private MyFloatView myFV=null;

	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //创建悬浮窗口
        createView();
    
    }
    
  
    
    private void createView(){
    	myFV=new MyFloatView(getApplicationContext());
    	myFV.setImageResource(R.drawable.icon);
    	//获取WindowManager
    	wm=(WindowManager)getApplicationContext().getSystemService("window");
        //设置LayoutParams(全局变量)相关参数
    	wmParams = ((MyApplication)getApplication()).getMywmParams();

         /**
         *以下都是WindowManager.LayoutParams的相关属性
         * 具体用途可参考SDK文档
         */
        wmParams.type=LayoutParams.TYPE_PHONE;   //设置window type
        wmParams.format=PixelFormat.RGBA_8888;   //设置图片格式,效果为背景透明

        //设置Window flag
        wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
                              | LayoutParams.FLAG_NOT_FOCUSABLE;
        /*
         * 下面的flags属性的效果形同“锁定”。
         * 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
         wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL 
                               | LayoutParams.FLAG_NOT_FOCUSABLE
                               | LayoutParams.FLAG_NOT_TOUCHABLE;
        */
        
        
        wmParams.gravity=Gravity.LEFT|Gravity.TOP;   //调整悬浮窗口至左上角
        //以屏幕左上角为原点,设置x、y初始值
        wmParams.x=0;
        wmParams.y=0;
        
        //设置悬浮窗口长宽数据
        wmParams.width=40;
        wmParams.height=40;
    
        //显示myFloatView图像
        wm.addView(myFV, wmParams);
    	
    }
    
    @Override
    public void onDestroy(){
    	super.onDestroy();
    	//在程序退出(Activity销毁)时销毁悬浮窗口
    	wm.removeView(myFV);
    }
    
   
    
}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.xsmile.fv"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:name=".MyApplication" android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MyFloatViewActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />


</manifest> 

转自:http://www.xsmile.net/?p=452
分享到:
评论

相关推荐

    android悬浮窗口可拖动

    android可拖动悬浮窗口 事件传递等 android可拖动悬浮窗口 事件传递等

    android全局悬浮窗口可拖动

    android全局悬浮窗口可拖动android全局悬浮窗口可拖动android全局悬浮窗口可拖动android全局悬浮窗口可拖动

    当今android最牛的悬浮窗口

    当今android最牛的悬浮窗口 内存监控 可用内存 已用内存 悬浮更新 随意拖动 不下载就后悔的

    android 添加随意拖动的桌面悬浮窗口

    android 添加随意拖动的桌面悬浮窗口

    Android悬浮歌词框 悬浮的Activity并可拖动

    一个java源码实现的Android悬浮框特效,用来模仿有些音乐播放器中的悬浮歌词功能,使用Android Activity并可拖动悬浮框,@author 丸子。触摸点相对于屏幕左上角坐标,这个悬浮歌词框支持更新界面,源代码内支持定义...

    android桌面悬浮按钮

    看 FloatsWindowView,MainActivity两个类就行了。 android桌面悬浮框,可以拖动,仿iphone的 那个touch助手

    android悬浮窗口

    在桌面添加可拖动/点击的悬浮窗口,很不错的哦 .

    悬浮小球悬浮窗口置顶可拖拽可点击(Qt c++)

    悬浮小球,小球置顶,可点击,可移动,可拖拽。鼠标左键点击可拖拽,鼠标右键点击打开百度网页,鼠标中键(点击滚轮)点击可关闭小球。

    android和Kotlin的可拖拽悬浮控件/可拖拽悬浮按钮带附件下载

    * 可拖拽的悬浮控件按钮 * 自动吸附左右边框 * 直接xml布局里引用即可。 * 要设置setOnClickListener点击事件,即可实现拖拽和点击功能。 * 尺寸大小,样式及背景图片遵循ImageView即可。 原文有介绍有动态介绍图...

    Android实现悬浮窗体效果

    突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失。效果图如下: 它的使用原理很简单,就是借用了WindowManager这个管理类来实现的。 1....

    android悬浮窗实现源码

    程序效果 : 在android手机的桌面屏幕上显示一个可拖动的悬浮窗口

    Android视频悬浮窗口实现的示例代码

    本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回 APP 页面,通过例子来讲述悬浮窗口实现原理及细节处理,效果图如下所示: 悬浮窗口.gif 原理  WindowManager 对 View 视图进行添加...

    Android 悬浮窗显示监测的内存信息 可关闭 可移动.rar

    一个实用的Android 内存监测悬浮窗,可用于监视某个应用或显示监视信息,本源码中的悬浮窗是用于内存监视器的窗口来用,显示监测到的一些信息,功能说明:  1.用户可任意拖动悬浮窗,自定义位置,并可任意调整窗口...

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

    突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失。效果图如下: 它的使用原理很简单,就是借用了WindowManager这个管理类来实现的。 1....

    react-native-floatWindow:RN仿微信悬浮窗口

    纯RN仿微信悬浮窗口 运行这个项目 npm install react-native run-ios或react-native run-android 用法 步骤1 npm install react-native-root-siblings 第2步 将SuspensionWindow浮动块拖动到自己的浮动块上 第三...

    Android自定义覆盖层控件 悬浮窗控件

    1、在手机桌面创建一个窗口,类似于360的悬浮窗口,点击这个窗口可以响应(至于窗口拖动我们可以后面再扩展)。 2、自己开发的应用去启动一个非本应用B,在B应用的某个界面增加一个引导窗口。 3、在应用的页面上...

Global site tag (gtag.js) - Google Analytics