浮动小部件 / Android启动器上的覆盖层

5
2个回答

11
那是通过在现有活动的顶部使用覆盖来完成的。您可以在我的 github 上找到源代码,以演示证明概念 - 安卓的stackexchange.com上有一个问题,其中一位残障人士无法滑动屏幕进行滚动,并正在寻找方便的方法来解决这个问题。我将代码拼凑在一起,只需轻敲文本(实际上,它是一个按钮),就可以显示“向上翻页 / 向下翻页”,最小化移动即可。但由于安卓和安全工作的方式,无法将滚动事件注入到当前运行的活动中。
它的工作原理是这样的,在onCreate活动中有这个:
WindowManager.LayoutParams layOutParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);

所需的标志是WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAYWindowManager.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游戏,该怎么办?

这就是需要注意的事项。


6

您可能想要查看Tooleap SDK。它提供了将常规Android活动转换为浮动小部件的最简单方法。

例如,假设您有一个名为MyActivity的活动

Intent intent = new Intent(context, MyActivity.class);
TooleapPopOutMiniApp miniApp = new TooleapPopOutMiniApp(context, intent);
Tooleap tooleap = Tooleap.getInstance(context);
tooleap.addMiniApp(miniApp);

现在,MyActivity将作为浮动小部件出现在任何其他应用程序的顶部。


看起来很有前途,它是免费的吗? - Shajeel Afzal
这是开源的吗? - shiami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接