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

本文实例讲述了android编程实现悬浮窗体的方法。分享给大家供大家参考,具体如下:

突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失。效果图如下:

它的使用原理很简单,就是借用了WindowManager这个管理类来实现的。

1.首先在AndroidManifest.xml中添加使用权限:
复制代码 代码如下:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

2.悬浮窗口布局实现

public class DesktopLayout extends LinearLayout { public DesktopLayout(Context context) { super(context); setOrientation(LinearLayout.VERTICAL);// 水平排列 //设置宽高 this.setLayoutParams( new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); View view = LayoutInflater.from(context).inflate( R.layout.desklayout, null); this.addView(view); }

3.在activity中让它显示出来。

// 取得系统窗体 mWindowManager = (WindowManager) getApplicationContext() .getSystemService("window"); // 窗体的布局样式 mLayout = new WindowManager.LayoutParams(); // 设置窗体显示类型——TYPE_SYSTEM_ALERT(系统提示) mLayout.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; // 设置窗体焦点及触摸: // FLAG_NOT_FOCUSABLE(不能获得按键输入焦点) mLayout.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; // 设置显示的模式 mLayout.format = PixelFormat.RGBA_8888; // 设置对齐的方法 mLayout.gravity = Gravity.TOP | Gravity.LEFT; // 设置窗体宽度和高度 mLayout.width = WindowManager.LayoutParams.WRAP_CONTENT; mLayout.height = WindowManager.LayoutParams.WRAP_CONTENT;

详细 MainActivity 代码如下:

package com.yc.yc_suspendingform; import android.app.Activity; import android.graphics.PixelFormat; import android.graphics.Rect; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.WindowManager; import android.widget.Button; import com.yc.yc_floatingform.R; public class MainActivity extends Activity { private WindowManager mWindowManager; private WindowManager.LayoutParams mLayout; private DesktopLayout mDesktopLayout; private long startTime; // 声明屏幕的宽高 float x, y; int top; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); createWindowManager(); createDesktopLayout(); Button btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { showDesk(); } }); } /** * 创建悬浮窗体 */ private void createDesktopLayout() { mDesktopLayout = new DesktopLayout(this); mDesktopLayout.setOnTouchListener(new OnTouchListener() { float mTouchStartX; float mTouchStartY; @Override public boolean onTouch(View v, MotionEvent event) { // 获取相对屏幕的坐标,即以屏幕左上角为原点 x = event.getRawX(); y = event.getRawY() - top; // 25是系统状态栏的高度 Log.i("startP", "startX" + mTouchStartX + "====startY" + mTouchStartY); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 获取相对View的坐标,即以此View左上角为原点 mTouchStartX = event.getX(); mTouchStartY = event.getY(); Log.i("startP", "startX" + mTouchStartX + "====startY" + mTouchStartY); long end = System.currentTimeMillis() - startTime; // 双击的间隔在 300ms以下 if (end < 300) { closeDesk(); } startTime = System.currentTimeMillis(); break; case MotionEvent.ACTION_MOVE: // 更新浮动窗口位置参数 mLayout.x = (int) (x - mTouchStartX); mLayout.y = (int) (y - mTouchStartY); mWindowManager.updateViewLayout(v, mLayout); break; case MotionEvent.ACTION_UP: // 更新浮动窗口位置参数 mLayout.x = (int) (x - mTouchStartX); mLayout.y = (int) (y - mTouchStartY); mWindowManager.updateViewLayout(v, mLayout); // 可以在此记录最后一次的位置 mTouchStartX = mTouchStartY = 0; break; } return true; } }); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Rect rect = new Rect(); // /取得整个视图部分,注意,如果你要设置标题样式,这个必须出现在标题样式之后,否则会出错 getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); top = rect.top;//状态栏的高度,所以rect.height,rect.width分别是系统的高度的宽度 Log.i("top",""+top); } /** * 显示DesktopLayout */ private void showDesk() { mWindowManager.addView(mDesktopLayout, mLayout); finish(); } /** * 关闭DesktopLayout */ private void closeDesk() { mWindowManager.removeView(mDesktopLayout); finish(); } /** * 设置WindowManager */ private void createWindowManager() { // 取得系统窗体 mWindowManager = (WindowManager) getApplicationContext() .getSystemService("window"); // 窗体的布局样式 mLayout = new WindowManager.LayoutParams(); // 设置窗体显示类型——TYPE_SYSTEM_ALERT(系统提示) mLayout.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; // 设置窗体焦点及触摸: // FLAG_NOT_FOCUSABLE(不能获得按键输入焦点) mLayout.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; // 设置显示的模式 mLayout.format = PixelFormat.RGBA_8888; // 设置对齐的方法 mLayout.gravity = Gravity.TOP | Gravity.LEFT; // 设置窗体宽度和高度 mLayout.width = WindowManager.LayoutParams.WRAP_CONTENT; mLayout.height = WindowManager.LayoutParams.WRAP_CONTENT; } }

完整实例代码代码点击此处本站下载。

希望本文所述对大家Android程序设计有所帮助。

时间: 2024-10-03 16:27:04

android编程实现悬浮窗体的方法的相关文章

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

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

Android编程实现Dialog窗体监听的方法

本文实例讲述了Android编程实现Dialog窗体监听的方法.分享给大家供大家参考,具体如下: 今天做了一个Dialong窗体监听包括窗体内的xml监听. 效果图: test.class代码 package com.test; import Android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; im

Android编程中黑名单的实现方法_Android

本文实例讲述了Android编程中黑名单的实现方法.分享给大家供大家参考,具体如下: 说明:由于挂断电话android   api不是对外开放的,所以需要使用反射的方法得到拨打电话的服务. 1.将android源代码中的"aidl"文件拷贝到项目中 这样项目中会生成两个包:android.telephony:此包中文件为:NeighboringCellInfo.aidl com.android.internal.telephony;此包中文件为:ITelephony.aidl 2.通过

Android编程中黑名单的实现方法

本文实例讲述了Android编程中黑名单的实现方法.分享给大家供大家参考,具体如下: 说明:由于挂断电话android   api不是对外开放的,所以需要使用反射的方法得到拨打电话的服务. 1.将android源代码中的"aidl"文件拷贝到项目中 这样项目中会生成两个包:android.telephony:此包中文件为:NeighboringCellInfo.aidl com.android.internal.telephony;此包中文件为:ITelephony.aidl 2.通过

Android编程设置全屏的方法实例

  Android编程设置全屏的方法实例          本文实例讲述了Android编程设置全屏的方法.分享给大家供大家参考,具体如下: 在实际的应用程序开发中,我们有时需要把 Activity 设置成全屏显示,一般情况下,可以通过两种方式来设置全屏显示效果.其一,通过在代码中可以设置,其二,通过manifest配置文件来设置全屏. 其一:在代码中设置(如下) package xiaohang.zhimeng; import android.app.Activity; import andr

Android编程Widget创建与使用方法简明教程_Android

本文实例讲述了Android编程Widget创建与使用方法.分享给大家供大家参考,具体如下: Android reference中有关于如何建立一个Widget的详细方法,这里简要说明一下,详情可以查看Android SDK中自带的reference. 要建立一个Widget,分为如下几个步骤: (1) 创建一个类,让其继承类AppWidgetProvider,在AppWidgetProvider中有许多方法,例如onDelete(Context,int[]),onEnable(Context)

Android编程之阴影(Shadow)制作方法_Android

本文实例讲述了Android编程之阴影(Shadow)制作方法.分享给大家供大家参考,具体如下: 先看运行效果图如下: 阴影制作:包括各种形状(矩形,圆形等等),以及文字等等都能设置阴影. 阴影制作是什么原理呢? 其实很简单,你需要设置阴影的东西被看作一个主层.然后在主层下面画一个阴影层. 阴影制作涉及到一个重要函数: public void setShadowLayer (float radius, float dx, float dy, int color) 参数: radius:阴影半径

Android编程实现自定义手势的方法详解_Android

本文实例讲述了Android编程实现自定义手势的方法.分享给大家供大家参考,具体如下: 之前介绍过如何在Android程序中使用手势,主要是系统默认提供的几个手势,这次介绍一下如何自定义手势,以及如何对其进行管理. 先介绍一下Android系统对手势的管理,Android系统允许应用程序把用户的手势以文件的形式保存以前,以后要使用这些手势只需要加载这个手势库文件即可,同时Android系统还提供了诸如手势识别.查找及删除等的函数接口,具体如下: 一.加载手势库文件: staticGestureL

Android编程获取GPS数据的方法详解_Android

本文实例讲述了Android编程获取GPS数据的方法.分享给大家供大家参考,具体如下: GPS是Android系统中重要的组成部分,通过它可以衍生出众多的与位置相关的应用. Android的GPS有一个专门的管理类,称为LocationManager,所有的GPS定位服务都由其对象产生并进行控制. 首先需要明确的是,LocationManager类的对象获取并不是直接创建的,而是由系统提供的,具体来说,通过如下方法,为一个LocationManager对象建立一个对象引用: 复制代码 代码如下: