安卓10源码环境 如何调用底层java api 创建一个透明View 且可以触摸 监听触摸 app_process来执行这个代码
要调用底层Java API创建一个透明View并监听触摸事件,可以按照以下步骤进行操作:
-
下载并编译安卓10源码,获取对应的系统库文件。
-
创建一个Java类,实现View.OnTouchListener接口,并重写onTouch方法,以监听触摸事件。
-
在该Java类中,创建一个透明的View对象,并设置其透明度为0。
-
通过反射调用系统库文件中的View类和WindowManager类,以创建并添加透明View到窗口中。
-
在app_process中,创建该Java类的实例,并调用其方法,以执行透明View的创建和触摸监听。
具体代码如下:
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.os.Looper;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TransparentView implements View.OnTouchListener {
private WindowManager mWindowManager;
private View mTransparentView;
private Context mContext;
public TransparentView(Context context) {
mContext = context;
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
}
public void createTransparentView() {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
mTransparentView = new View(mContext);
mTransparentView.setBackgroundColor(0x00000000);
mTransparentView.setOnTouchListener(TransparentView.this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
mWindowManager.addView(mTransparentView, params);
}
});
}
public void removeTransparentView() {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
if (mTransparentView != null) {
mWindowManager.removeView(mTransparentView);
mTransparentView = null;
}
}
});
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// 处理触摸事件
return true;
}
public static void main(String[] args) {
try {
// 加载系统库文件
Class<?> clazzView = Class.forName("android.view.View");
Class<?> clazzWindowManager = Class.forName("android.view.WindowManagerImpl");
Constructor<?> constructorWindowManager = clazzWindowManager.getDeclaredConstructor(Context.class);
Method methodAddView = clazzWindowManager.getDeclaredMethod("addView", View.class, WindowManager.LayoutParams.class);
Method methodRemoveView = clazzWindowManager.getDeclaredMethod("removeView", View.class);
// 创建TransparentView实例
TransparentView transparentView = new TransparentView((Context) clazzView.getDeclaredMethod("getContext").invoke(null));
// 创建透明View并添加到窗口
transparentView.createTransparentView();
// 等待触摸事件
while (true) {
Thread.sleep(1000);
}
// 移除透明View
transparentView.removeTransparentView();
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException | InterruptedException e) {
e.printStackTrace();
}
}
}
在app_process中,可以通过以下方式来执行该代码:
public static void main(String[] args) {
TransparentView.main(args);
}
注意,此代码需要在root权限下运行
原文地址: http://www.cveoy.top/t/topic/ckGR 著作权归作者所有。请勿转载和采集!