t0m*_*13b 11

无论如何,都可以在现有活动的顶部使用叠加层来完成.你可以在我的github上找到这里的源代码,以展示android的stackexchange.com问题中的概念证明,其中有人患有残疾并且无法刷屏幕滚动并且正在寻找一种方便的方法在其中我拼凑了代码,以最小的移动显示'Page Up/Page Down',只需点击覆盖在活动之上的文本(实际上,它是一个按钮).但由于Android和安全性的工作方式,滚动事件无法注入当前正在运行的活动中.

它的工作方式是这个,从onCreate活动就是这个

WindowManager.LayoutParams layOutParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);
Run Code Online (Sandbox Code Playgroud)

需要的标志是WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAYWindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH.

责任在于确保正在处理触摸,这意味着当触摸事件"击中"某个区域并相应地采取行动时进行监视.通过"监听"View的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) {
      ....
    }
});
Run Code Online (Sandbox Code Playgroud)

例如,想象一下该myview布局中的按钮,因此使用按钮小部件,

Button myButton = (Button)myView.findViewById(R.id.myButton);
Rect outRectHit = new Rect();
myButton.getHitRect(outRectHit);
Run Code Online (Sandbox Code Playgroud)

现在我们需要确定触摸边界的"碰撞",它发生在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
}
Run Code Online (Sandbox Code Playgroud)

这个简短的摘要解释了如何在任何活动的顶部进行覆盖.

只是为了确保代码得到调试,并且不会干扰任何显示的任何活动的形状或形式.例如,如果活动实际上是一个OpenGL游戏会发生什么,你做什么?

这是为了说明需要注意什么.


小智 6

您可能想看一下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);
Run Code Online (Sandbox Code Playgroud)

MyActivity现在可以作为任何其他应用程序之上的浮动小部件使用.