【发布时间】:2019-02-06 22:44:17
【问题描述】:
有人知道如何实现吗?
一些例子:
- https://play.google.com/store/apps/details?id=gpc.myweb.hinet.net.PopupVideo
- https://play.google.com/store/apps/details?id=com.milone.floatwidget
有什么想法吗?谢谢。
【问题讨论】:
有人知道如何实现吗?
一些例子:
有什么想法吗?谢谢。
【问题讨论】:
无论如何,这是在现有活动之上使用覆盖来完成的。您可以在我的github 上找到此处的源代码,以展示 android 的 stackexchange.com 问题中的概念证明,其中有人患有残疾且无法滑动屏幕滚动并正在寻找一种方法来做这很方便,我将代码拼凑在一起,以最小的移动显示“向上翻页/向下翻页”,只需点击覆盖在活动顶部的文本(实际上,它是一个按钮)。但由于 Android 和安全性的工作方式,滚动事件无法注入当前运行的 Activity。
它的工作方式是这样的,来自onCreate活动有这个
WindowManager.LayoutParams layOutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
需要的标志是WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY 和WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH。
责任是确保触摸正在被处理,这意味着当触摸事件“击中”某个区域时要小心并采取相应的行动。通过“监听”视图的onTouch 事件,即:
LayoutInflater layOutInflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
View myView = layOutInflater.inflate(R.layout.myview, null);
myView.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
....
}
});
例如,想象myview 布局中的按钮,因此使用按钮小部件,
Button myButton = (Button)myView.findViewById(R.id.myButton);
Rect outRectHit = new Rect();
myButton.getHitRect(outRectHit);
现在我们需要确定触摸边界的“碰撞”,它发生在onTouch 处理程序内部:
float x = event.getX();
float y = event.getY();
if (x > outRectHit.left && x < outRectHit.right &&
y > outRectHit.top && y < outRectHit.bottom){
... Handle this accordingly
}
这个简短的摘要解释了如何在任何活动之上做这样的事情。
只是为了确保代码经过调试并且不会以任何形式或形式干扰显示的任何活动。例如,如果活动实际上是一个 OpenGL 游戏会发生什么,你会怎么做?
那是为了说明需要注意什么。
【讨论】:
您可能想看看Tooleap SDK。 它提供了将常规 Android 活动转换为浮动小部件的最简单方法。
例如,假设您有一个名为 MyActivity 的 Activity
Intent intent = new Intent(context, MyActivity.class);
TooleapPopOutMiniApp miniApp = new TooleapPopOutMiniApp(context, intent);
Tooleap tooleap = Tooleap.getInstance(context);
tooleap.addMiniApp(miniApp);
MyActivity 现在可以作为浮动小部件出现在任何其他应用程序之上。
【讨论】: