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程序设计有所帮助。

(0)

相关推荐

  • Android仿360悬浮小球自定义view实现示例

    Android仿360悬浮小球自定义view实现示例 效果图如下: 实现当前这种类似的效果 和360小球 悬浮桌面差不错类似.这种效果是如何实现的呢.废话不多说 ,直接上代码. 1.新建工程,添加悬浮窗权限. <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 2.自定义一个FloatMessagerMainWindow import android.content.Contex

  • 不依赖于Activity的Android全局悬浮窗的实现

    前言 当我们在手机上使用360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可跳转到安全卫士的操作界面,而且该浮动窗口不受其他activity的覆盖影响仍然可见(多米音乐也有相关的和主界面交互的悬浮小窗口).那么这种不受Activity界面影响的悬浮窗口是怎么实现的呢? Android悬浮窗实现 实现基础 Android悬浮窗实现使用WindowManager WindowManager介绍 通过Context.getSystemService(Context.WINDOW_S

  • Android滑动组件悬浮固定在顶部效果

    要想实现的效果是如下: 场景:有些时候是内容中间的组件当滑动至顶部的时候固定显示在顶部. 实现的思路: 1.目标组件(button)有两套,放在顶部和内容中间: 2.当内容中间的组件滑动至顶部栏位置时控制显示/隐藏顶部和中间的组件(涉及到组件获取在屏幕的位置知识点): activity代码: public class MainActivity extends AppCompatActivity implements ObservableScrollView.ScrollViewListener

  • Android实现App中导航Tab栏悬浮的功能

    首先是"饿了么"导航Tab栏悬浮的效果图. 大家可以看到上图中的"分类"."排序"."筛选"会悬浮在app的顶部,状态随着ScrollView(也可能不是ScrollView,在这里姑且把这滑动的UI控件当作ScrollView吧)的滚动而变化.像这种导航Tab栏悬浮的作用相信大家都能体会到,Tab栏不会随着ScrollView等的滚动而被滑出屏幕外,增加了与用户之间的交互性和方便性. 看到上面的效果,相信大家都跃跃欲试了,那

  • Android实现桌面悬浮窗、蒙板效果实例代码

    现在很多安全类的软件,比如360手机助手,百度手机助手等等,都有一个悬浮窗,可以飘浮在桌面上,方便用户使用一些常用的操作. 今天这篇文章,就是介绍如何实现桌面悬浮窗效果的. 首先,看一下效果图. 悬浮窗一共分为两个部分,一个是平常显示的小窗口,另外一个是点击小窗口显示出来的二级悬浮窗口. 首先,先看一下这个项目的目录结构. 最关键的就是红框内的四个类. 首先,FloatWindowService是一个后台的服务类,主要负责在后台不断的刷新桌面上的小悬浮窗口,否则会导致更换界面之后,悬浮窗口也会随

  • Android开发悬浮按钮 Floating ActionButton的实现方法

    一.介绍 这个类是继承自ImageView的,所以对于这个控件我们可以使用ImageView的所有属性 android.support.design.widget.FloatingActionButton 二.使用准备, 在as 的 build.grade文件中写上 compile 'com.android.support:design:22.2.0' 三.使用说明 xml文件中,注意蓝色字体部分 <android.support.design.widget.FloatingActionButt

  • Android实现类似360,QQ管家那样的悬浮窗

    一.前言: 我手机从来不装这些东西,不过,有次看到同事的android手机上,有个QQ管家在桌面上浮着,同事拖动管家时,管家就变成一只鸟,桌面下方还有个弹弓,桌面顶部有只乌鸦,把管家也就是鸟拖动到弹弓那,然后,松手,鸟就飞出去.这个过程是动画过程,做的事,实际上是清楚内存. 二:原理: 其实,没什么原理,用到的就是WindowManager以及WindowManager.LayoutParams,对这个LayoutParams做文章,当设置为属性后,然后,创建一个View,将这个View添加到W

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

    用过新版本android 360手机助手都人都对 360中只在桌面显示一个小小悬浮窗口羡慕不已吧? 其实实现这种功能,主要有两步: 1.判断当前显示的是为桌面.这个内容我在前面的帖子里面已经有过介绍,如果还没看过的赶快稳步看一下哦. 2.使用windowManager往最顶层添加一个View .这个知识点就是为本文主要讲解的内容哦.在本文的讲解中,我们还会讲到下面的知识点: a.如果获取到状态栏的高度 b.悬浮窗口的拖动 c.悬浮窗口的点击事件 有开始之前,我们先来看一下效果图:  接下来我们来

  • Android实现顶部悬浮效果

    本文实例为大家分享了Android实现顶部悬浮效果的具体代码,供大家参考,具体内容如下 效果图 布局 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http:

  • Android中悬浮窗口的实现原理实例分析

    本文实例讲述了Android中悬浮窗口的实现原理.分享给大家供大家参考.具体如下: 用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下: 调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了.比如创建系统顶级窗口,实现悬浮

随机推荐