Android 悬浮窗获取点击拖拽事件 10C

之前参照网上例子写过一个demo,实现在Activity中点击最小化按钮,将该Activity finish,并启动servie生成一个悬浮按钮,可点击也可拖拽;
最近工作需要也做一个相似的悬浮窗,悬浮按钮生成了,App被Home也能存在,不会
消失,但该悬浮按钮却没法捕获点击和拖拽事件。
这两个代码几乎一摸一样,请大神们帮忙看下是哪里出的问题,谢谢!

代码如下:
package com.example.menqi.myapplication;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;

public class MyService extends Service {

private WindowManager mWindowManager;
private WindowManager.LayoutParams mLayoutParams;
/**
 * float的布局view
 */
private View mFloatView;
private ViewGroup glSurfaceView;
private int mFloatWinWidth,mFloatWinHeight;//悬浮窗的宽高
//private int mFloatWinMarginTop,mFloatWinMarginRight;

public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    createWindowManager();
    createFloatView();
    return super.onStartCommand(intent, flags, startId);

}


@Override
public void onDestroy() {
    super.onDestroy();
    removeFloatView();
}

private void createWindowManager() {
    // 取得系统窗体
    mWindowManager= (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    //计算得出悬浮窗口的宽高
    DisplayMetrics metric =new DisplayMetrics();
    mWindowManager.getDefaultDisplay().getMetrics(metric);
    int screenWidth = metric.widthPixels;
    mFloatWinWidth = screenWidth *1/3;
    mFloatWinHeight=mFloatWinWidth*4/3;
    //mFloatWinMarginTop= (int)this.getResources().getDimension(R.dimen.rkcloud_av_floatwin_margintop);
    //mFloatWinMarginRight= (int)this.getResources().getDimension(R.dimen.rkcloud_av_floatwin_marginright);

    // 窗体的布局样式
    // 获取LayoutParams对象
    mLayoutParams=new WindowManager.LayoutParams();
    // 确定爱悬浮窗类型,表示在所有应用程序之上,但在状态栏之下
    //TODO? 在android2.3以上可以使用TYPE_TOAST规避权限问题
    mLayoutParams.type= WindowManager.LayoutParams.TYPE_TOAST;//TYPE_PHONE
    mLayoutParams.format= PixelFormat.RGBA_8888;
    mLayoutParams.flags= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
    // 悬浮窗的对齐方式
    mLayoutParams.gravity= Gravity.LEFT| Gravity.TOP;
    // 悬浮窗的位置
    mLayoutParams.x=70;
    mLayoutParams.y=210;
    mLayoutParams.width=mFloatWinWidth;
    mLayoutParams.height=mFloatWinHeight;
}

//开始触控的坐标,移动时的坐标(相对于屏幕左上角的坐标)
private int mTouchStartX, mTouchStartY, mTouchCurrentX, mTouchCurrentY;
//开始时的坐标和结束时的坐标(相对于自身控件的坐标)
private int mStartX, mStartY, mStopX, mStopY;
//判断悬浮窗口是否移动,这里做个标记,防止移动后松手触发了点击事件
private boolean isMove;


/**
 * 创建悬浮窗
 */
private void createFloatView() {

    LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
    mFloatView= inflater.inflate(R.layout.floatlayout, null);
    glSurfaceView= (ViewGroup)mFloatView.findViewById(R.id.VOIPFloatView);
    //glSurfaceView.setPreserveEGLContextOnPause(true);
    glSurfaceView.setKeepScreenOn(true);
    mWindowManager.addView(mFloatView,mLayoutParams);




    mFloatView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v,MotionEvent event) {
            int action = event.getAction();
            /*if(MotionEvent.ACTION_DOWN == action) {
                mStartX=mLastX= (int) event.getRawX();
                mStartY=mLastY= (int) event.getRawY();
            }else if(MotionEvent.ACTION_UP == action) {
                int dx = (int) event.getRawX() -mStartX;
                int dy = (int) event.getRawY() -mStartY;
                if(Math.abs(dx) >5|| Math.abs(dy) >5) {
                    return true;
                }
            }else if(MotionEvent.ACTION_MOVE == action) {
                int dx = (int) event.getRawX() -mLastX;
                int dy = (int) event.getRawY() -mLastY;
                mLayoutParams.x=mLayoutParams.x- dx;
                mLayoutParams.y=mLayoutParams.y+ dy;
                mWindowManager.updateViewLayout(mFloatView,mLayoutParams);
                mLastX= (int) event.getRawX();
                mLastY= (int) event.getRawY();
            }
            return false;*/
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    isMove = false;
                    mTouchStartX = (int) event.getRawX();
                    mTouchStartY = (int) event.getRawY();
                    mStartX = (int) event.getX();
                    mStartY = (int) event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    mTouchCurrentX = (int) event.getRawX();
                    mTouchCurrentY = (int) event.getRawY();
                    mLayoutParams.x += mTouchCurrentX - mTouchStartX;
                    mLayoutParams.y += mTouchCurrentY - mTouchStartY;
                    mWindowManager.updateViewLayout(mFloatView, mLayoutParams);

                    mTouchStartX = mTouchCurrentX;
                    mTouchStartY = mTouchCurrentY;
                    break;
                case MotionEvent.ACTION_UP:
                    mStopX = (int) event.getX();
                    mStopY = (int) event.getY();
                    if (Math.abs(mStartX - mStopX) >= 1 || Math.abs(mStartY - mStopY) >= 1) {
                        isMove = true;
                    }
                    break;
            }
            //如果是移动事件不触发OnClick事件,防止移动的时候一放手形成点击事件
            return isMove;

        }
    });

    mFloatView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ToVOIPActivity();
            MyService.this.stopSelf();
        }
    });

    /*VideoRendererGui.setView(glSurfaceView, new Runnable() {
        @Override
        public void run() {
            if(WebRtcHelperEx.getInstance().isWebRtcChanelAlive()) {
                WebRtcHelperEx.getInstance().updateVideoUI(WebRtcHelperEx.latestLocalVideoSize,WebRtcHelperEx.latestRemoteVideoSize);
            }
        }
    });
    if(WebRtcHelperEx.getInstance().isWebRtcChanelAlive()) {
        LogEx.d(TAG,"createFloatView: webrtc instance is alive and we will call resetRenders");
        WebRtcHelperEx.getInstance().resetRenders();
        WebRtcHelperEx.getInstance().updateVideoUI(WebRtcHelperEx.VIDEOSIZE_SMALL,WebRtcHelperEx.VIDEOSIZE_BIG);
    }*/

}

private void removeFloatView() {
    if(mFloatView != null && mWindowManager != null) {
        mWindowManager.removeView(mFloatView);
    }
}

/**
 * 单击后回到@WebRTCActivity以切换为大尺寸页面
 */
private void ToVOIPActivity() {
    //TODO跳转到Activity
    Intent intentToActivity = new Intent(this, Main2Activity.class);//WebPhoneIncomingCallActivity来电页面
    intentToActivity.setFlags(FLAG_ACTIVITY_NEW_TASK);
    startActivity(intentToActivity);
}

}

layout

<?xml version="1.0" encoding="utf-8"?>
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/VOIPFloatView"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/avcallfloat"
android:scaleType="centerInside" />

0

4个回答

权限,需要主动申请

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

谢谢,已经申请了,没有效果

0

点击时,isMove=false,所以View不会消费事件的,Move和Up都不会响应的。
其实你用个view.performClick可以简单点

0
u014043113
天然大咪咪 你可以再设置个view.setOnClickListener点击事件。在setOnTouchListener中返回true消费掉,并在UP中判断是移动还是点击,点击的话调用view.performClick();
一年多之前 回复
u014043113
天然大咪咪 也就是只有Down能消费事件。
一年多之前 回复

你的布局是只有一个ViewGroup吗?还是里头还有其他控件,布局没有贴全。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Android 悬浮窗 可点击
Android 悬浮窗 ,并且悬浮窗可点击,有响应事件
Android 悬浮按钮取点击拖拽事件
实现的是启动一个service生成一个悬浮按钮,点击事件实现home键的功能直接上代码:java:public class FloatKeyService extends AccessibilityService { private Button bnBack = null; private WindowManager wmMngr = null; private WindowManager....
Android之获取动态悬浮窗权限
需要两步: 一、在清单配置文件中声明权限: &amp;lt;uses-permission android:name=&quot;android.permission.SYSTEM_ALERT_WINDOW&quot; /&amp;gt; 二、代码申请权限: private static final int REQUEST_OVERLAY = 4444; private void requestOverlayPermi...
Android 悬浮窗
部分代码有看他人的,链接如下点击打开链接 package com.haiwangch.mysecondfloat; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Me
android 悬浮窗
android 学习 悬浮窗 android
android 悬浮窗 类似360悬浮窗
android 悬浮窗 类似360悬浮窗 可拖动
android 悬浮窗点击打开自身应用慢
[size=16px]我现在有一个需求就是 开启一个悬浮窗 悬浮窗是一个按钮 点击悬浮窗的时候 要打开软件(效果要和在桌面上点击软件图标一样) 现在我遇到的问题是rn 第一: 在我的应用的主界面我按了系统的HOME键返回到桌面的时候 再次点击我的悬浮窗 打开我的应用 就得等一会儿 才能显示 但是点击桌面图标却很快 rn 第二:当我在我的应用的主界面点击返回键(我自己处理了加入到HOME里面,而不是响应系统的返回键)的时候 这个时候再次点击我的悬浮窗就很快打开,和点击桌面图标一样快,找了一整天,不知道是和何原因?有知道的,说一下哈,谢谢!rn(说明:悬浮窗是个service)[/size]
Android 可拖动可点击悬浮窗
Android 悬浮窗在5.0以上,特别是小米手机,魅族手机,就算给到了 2 这个权限也是不会显示出来的,还需要在设置把悬浮权限开关给打开 最近公司项目要用到一个应用内的悬浮框,需要在当前的这个应用每个页面都显示出来,并且悬浮框可随手指移动,但是停止时,要靠边,可以点击,其实这些问题都不是大问题,就是Android5.0,6.0这些机Android类型,又或者不同机型,权
Android 自动化测试关于悬浮窗点击(DecorView)
本文对Robotium的悬浮窗实现进行一点调研     Robotium本身支持悬浮窗点击,这里我们可以参考详细看下源码     与Uiautomator稍微不一样的是Robotium获取到的是Activtity的rootview,而Uiautomator直接获取的已经不是rootview了,从这个原理可以看出使用Uiautomator实现悬浮窗抓取也许是不可实现的(个人观点)
悬浮窗,点击收缩/展开
悬浮窗,点击收缩/张开效果图 说明:点击”+“按钮,悬浮窗收缩/展开思路1、在html中定义一个div块,定一个id;一个按钮,点击时用。2、写一个js,包含收缩以及展开的函数;为按钮添加点击事件。3、想要让悬浮窗好看点,可设置对应的参数。步骤html <div id="area"> <div id="small_menu"> <ul>
cocos creator 牌点击和拖拽事件
this.myCards是所有手牌数组 里面存的Sprite //牌滑动事件and 点击事件 cardTouch() { this.isMove = false var self = this for (let i = 0; i &lt; this.myCards.length; i++) { this.myCards[i].node.on(cc.Node.EventType.TOUCH_S...
拖拽事件
这里写的是一个原生js实现拖拽的效果,首先: 1、实现拖拽的三大事件,是要首先清楚的 onmousedown (鼠标按下的时候)、onmousemove(鼠标移动的时候)、onmouseup(鼠标松开的时候) 2、给目标元素加上onmousedown时间,记录鼠标按下的时候,鼠标距离所在元素的位置(就是鼠标距离所在元素边界的距离left、top)记录为disX、disY。要注意的是,要移动的
android实例之 流量监控悬浮窗 实时网速的获取
网上那个有bug,这个是我修改的。喜欢的可以下
Android 桌面悬浮窗(仿360悬浮窗)
Android 桌面悬浮窗(仿360悬浮窗)实现原理悬浮窗常用参数所需权限代码 实现原理 悬浮窗主要是使用WindowManager这个类来实现的,调用这个类的addView()方法添加一个悬浮窗,updateViewLayout()方法用于更新悬浮窗的参数,removeView()用于移除悬浮窗。 悬浮窗常用参数 WindowManager.LayoutParams这个类用于提供悬浮窗所需的参...
可拖动点击的桌面悬浮窗
可拖动点击的桌面悬浮窗,网上找了很多,或多或少感觉都不能满足要求,自己整理修改了下,可以了,希望能帮到以后遇到类似问题的小伙伴
Android 悬浮窗的简单实现
概述 利用WindowManager(窗口管理器)和WindowManager.LayoutParams(参数属性)来实现一个小悬浮窗。 这是效果图: 布局很简单就略了。下面是代码: java源码 public class MainActivity extends Activity implements View.OnClickListener { Button btn_
Android 悬浮窗的实现源码
Android 悬浮窗的实现源码 悬浮窗的实现用到了一个Service、自定义View、Activity 效果图 悬浮窗的实现用到的权限: 在清单文件中注册服务 代码的实现 1.Activity的源码 package com.pca.nettraffic; import android.app.Activity; i
Android 悬浮窗使用
一、添加权限如下 &amp;lt;uses-permission android:name=&quot;android.permission.SYSTEM_ALERT_WINDOW&quot;/&amp;gt; &amp;lt;uses-permission android:name=&quot;android.permission.SYSTEM_OVERLAY_WINDOW&quot;/&amp;gt; 二、以Service为依赖弹出悬浮窗【MWindowS...
(Android)桌面悬浮窗
悬浮窗一直都觉得是个高大上的东西,但是当你剖析之后,就会发现其实也挺简单的,就是判断当前界面是否是桌面,然后开启一个Service 悬浮窗涉及到WindowManager,通过调用其中的几个方法:addView(添加悬浮窗)、removeView(移除悬浮窗)、updateViewLayout(更新悬浮窗); 首先就是申请权限:<uses-permission android:name="and
Android 悬浮窗全系统实现
Android系统悬浮窗的实现,以button按钮为例,实现悬浮窗的展示,以及悬浮窗的拖动效果,对Android 6.0以下、Android 6.0以上,以及Android 8.0以上做了处理,可以适应大部分Android版本
Android 悬浮窗权限问题解决
前段时间,项目需要做一个类似于360加速器的东西,Android机型这么多,好多手机都把这个权限给默认关闭掉了,处理这个问题真的好麻烦,不过最后还是解决了这个问题。 接下来我将和大家分享下我是怎么解决这个问题呢。 1.悬浮窗主要用到的技术是WindowManager,设置WindowManager.LayoutParams是关键 我首先设置的params.type = LayoutP
Android 悬浮窗基本使用
很多 iPhone 用户都喜欢打开一项设置,那就是 AssistiveTouch ,我们俗称小白点,它位于整个屏幕之上,就像是漂浮在所有的 App 之上。Android 手机上也有很多应用有这样的东西,比如 360 或者其他主要是手机管家之类的软件。 在之前的公司项目中也有用到这样的悬浮窗,虽然权限有些敏感,但是还算是比较常用,所以在这里记录一下它的基本使用。
Android之仿IOS悬浮窗
在一些场合里,我们使用悬浮窗会有很大的便利,比如IOS系统的悬浮窗,360或者其他手机卫士的悬浮窗等等。本篇博客,我们创造出两个悬浮窗,通过点击小悬浮窗打开或者关闭大悬浮窗(一个播放控制器)。代码如下:在这之前,我们需要在manifest中申请权限:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />并且,
android——悬浮窗控件Toast
前端 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="ma
Android 悬浮窗开发的坑
android TV的悬浮窗和android 手机开发的悬浮窗都是差不多的。具体实现看上一篇。就是有几个坑需要注意一下:1.type类型:手机:new LayoutParams().type = LayoutParams.TYPE_PHONE;该类型需要悬浮窗权限。 tv :LayoutParams().type = LayoutParams.TYPE_TOAST;这个类型不需要权限,但是在应用退
Android 视频悬浮窗
本代码资源是关于,Android视频悬浮窗的,里面的代码可以直接运行
android 悬浮窗权限的申请
if (Build.VERSION.SDK_INT &amp;amp;gt;= Build.VERSION_CODES.M) { if(!Settings.canDrawOverlays(this)){ //没有悬浮窗权限,跳转申请 Intent intent = new Intent(Settings.ACTION_MA...
Android 悬浮窗权限问题
显示悬浮窗,需要有一个服务运行在后台, 通过getSystemService(Context.WINDOW_SERVICE)拿到WindowManager, 然后向其中addView, addView第二个参数是一个WindowManager.LayoutParams,WindowManager.LayoutParams中有一个成员type,一般设置成TYPE_PHONE就可以悬浮在很多view的...
android 悬浮窗教程
悬浮窗教程,很简单。知识点不多,写下来 总结一下。 权限 首先 是在AndroidManiFest.xml 定义权限 如果 Android版本大于6.0 ,还需要引导用户 同意这个权限才行。并不是 你定义了就会给你的。 //判断是否 有悬浮窗的权限 if (!Settings.canDrawOverlays(getApplicationContext())) { ...
Android辅助权限与悬浮窗
在执行自动化服务的流程中,我们其实并不希望被用户的操作中断流程,所以有什么方法在用户点击自动化操作的过程中,避免用户再次操作呢?那就是开启一个全局透明的悬浮窗,进行屏蔽触摸事件。 1.悬浮窗 其实一开始,我是想当然的跟以前一样,开启一个全屏的透明的悬浮窗,进行遮罩的作用,但是发现,设置 Type 为 TYPE_TOAST 或者 TYPE_SYSTEM_ALERT 这样的悬浮窗某些类型的不同,...
android桌面悬浮窗
android下的桌面悬浮窗,可自由拖动,并监控在运行非桌面app的时候隐藏它。
android 悬浮窗显示内存
android 悬浮窗显示内存
Android 悬浮窗的创建与移除
本文主要是介绍悬浮窗的创建与移除,并能通过点击悬浮窗图标回到应用主界面。本文是通过参考网上的文章并通过自己修改完成的。本文主要参考的文章是:http://blog.csdn.net/guolin_blog/article/details/8689140 1.MainActivity.java import android.app.Activity; import android.content
Android进阶-悬浮窗
Android进阶-悬浮窗需求如标题,那么怎么做出这个效果呢? -> 主要依赖WindowManeger我们使用WindowManeger,也可以把自己定义的一个控件(悬浮窗),可以在其他应用最上层,甚至手机桌面最上层显示窗口。 调用的是WindowManager继承自基类的addView方法和removeView方法来显示和隐藏窗口 悬浮窗口并不受activity的影响,他是隶属于启动它的应用
Android中加入悬浮窗
悬浮窗可以一直在前台显示一些信息,无论当前的Activity是哪个应用的。比如显示当前的上下行网速等   import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import a...
qt for android 实现悬浮窗
在qt for android上实现的悬浮窗,程序比较粗糙,第一次运行需要允许overlay权限,可以简单参考下
android 悬浮窗 监视内容
android 悬浮窗 监视内容
android伸缩式悬浮窗
利用windowmanager实现的可伸缩式悬浮窗,可以跟随手指移动。
Android仿QQ悬浮窗
Android仿的QQ管家悬浮窗,可以发射小火箭
相关热词 c#串口测试应用程序 c# 匹配 正则表达式 c#防止窗体重绘 c#读写txt文件 c#挖地雷源代码 c#弹框选项 c# 移除 队列 c# 密码写入配置文件 c# 获取可用内存大小 c# 嵌入excel编辑