android - 如何通过可访问性服务覆盖来制作触摸事件?
问题描述
我目前正在开发一个无障碍服务,它有两个视图。一个按钮和一个简单的彩色视图。当我触摸按钮时,彩色视图会出现/消失。这是服务的代码 -
package com.hardik.accessibiltyservicetest;
import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.FingerprintGestureController;
import android.graphics.PixelFormat;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import in.championswimmer.sfg.lib.SimpleFingerGestures;
public class Service extends AccessibilityService {
FrameLayout mLayout;
WindowManager.LayoutParams lp;
LayoutInflater inflater;
WindowManager wm;
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
@Override
public void onInterrupt() {
}
@Override
protected void onServiceConnected() {
// Create an overlay and display the action bar
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
mLayout = new FrameLayout(this);
lp = new WindowManager.LayoutParams();
lp.type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
lp.format = PixelFormat.TRANSLUCENT;
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.MATCH_PARENT;
lp.gravity = Gravity.CENTER;
inflater = LayoutInflater.from(this);
inflater.inflate(R.layout.action_bar, mLayout);
wm.addView(mLayout, lp);
configurePowerButton();
}
boolean is = true;
private void configurePowerButton() {
SimpleFingerGestures obj = new SimpleFingerGestures();
obj.setDebug(true);
obj.setConsumeTouchEvents(true);
obj.setOnFingerGestureListener(new SimpleFingerGestures.OnFingerGestureListener() {
@Override
public boolean onSwipeUp(int i, long l, double v) {
Log.e("Swipe", "Up "+i);
return false;
}
@Override
public boolean onSwipeDown(int i, long l, double v) {
return false;
}
@Override
public boolean onSwipeLeft(int i, long l, double v) {
return false;
}
@Override
public boolean onSwipeRight(int i, long l, double v) {
return false;
}
@Override
public boolean onPinch(int i, long l, double v) {
return false;
}
@Override
public boolean onUnpinch(int i, long l, double v) {
return false;
}
@Override
public boolean onDoubleTap(int i) {
return false;
}
});
Button powerButton = mLayout.findViewById(R.id.power);
final View img = mLayout.findViewById(R.id.view);
powerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//performGlobalAction(GLOBAL_ACTION_POWER_DIALOG);
Toast.makeText(getApplicationContext(), "yus", Toast.LENGTH_SHORT).show();
if (is){
is = false;
img.setVisibility(View.GONE);
}
else{
is =true;
img.setVisibility(View.VISIBLE);
}
}
});
img.setOnTouchListener(obj);
}
}
这是布局文件 -
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/power"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="32dp"
android:background="#80FFFFFF"
android:text="Test"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/view"
android:layout_width="300dp"
android:layout_height="300dp"
android:background="#000000"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
触摸事件,一切正常。但问题是,当前的 windowmanager 参数长度和宽度设置为匹配父级,覆盖阻止触摸事件到 android ui 本身,换句话说,除非覆盖停止,否则 android ui 的任何部分都不会响应,因为覆盖消耗所有触摸输入。最大的挫折是我希望覆盖就像我在布局中设计的那样,并且通过设置任何其他长度和宽度参数,背景触摸问题就会开始,即它再次开始消耗触摸事件。
当我设置参数以包装内容时,它并没有消耗所有的触摸事件,但这并没有为我提供服务所需的用户界面。
也不介意使用手势库,代码是我个人项目的一部分。
提前致谢。
解决方案
i found a fix. just make separate layouts for each element
推荐阅读
- postgresql - PostgreSQL:`新的。
`AFTER TRIGGER` 被触发时返回 `NULL` - javascript - 更改或最小化浏览器选项卡(Nuxt Js、Slider、JavaScript)时的网页设计问题
- javascript - 来自三个数组的值 - 加法或减法
- python-3.x - 有没有办法将文件从本地机器复制到 python + apache 梁中的 Dataflow 线束实例
- httpcontext - HttpContext.Current.Session.SessionID 在项目外部实例化时抛出“对象引用错误”
- r - r:成对联合数据框列
- python - Django Rest API - 将 prefetch_related 与 ModelSerializer 一起使用
- visual-studio-2015 - 为什么 Visual Studio 2015 不断从 Project 中删除文件?
- c# - 从 ASP.NET Web Api 中的中间件访问 JsonOptions
- nginx - nginx $http_upgrade 在 openresty access_by_lua_block