首先自己恭喜自己找到新的工作,这段时间也把自己的写过的一些功能做个总结。
手势快捷操作现在很多手机厂商都有做,三指截屏只是一个例子,可以通过这个例子去实现某个操作<->某个动作。本文只是写个简单的需求,后期可能自己扩展,例如像OPPO系统的上三指分屏,下三指截图。

一:修改的文件如下

M alps/frameworks/base/api/current.txt
M alps/frameworks/base/api/system-current.txt
M alps/frameworks/base/api/test-current.txt
M alps/frameworks/base/core/java/android/provider/Settings.java
M alps/frameworks/base/core/java/android/view/ViewGroup.java
M alps/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
M alps/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
M alps/frameworks/base/packages/SystemUI/AndroidManifest.xml
M alps/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
M alps/packages/apps/Settings/AndroidManifest.xml
A alps/packages/apps/Settings/res/drawable-xhdpi/ic_settings_three_screenshot.png
M alps/packages/apps/Settings/res/values-zh-rCN/strings.xml
M alps/packages/apps/Settings/res/values/strings.xml
M alps/packages/apps/Settings/src/com/android/settings/Settings.java
M alps/packages/apps/Settings/src/com/android/settings/SettingsActivity.java
A alps/packages/apps/Settings/src/com/android/settings/fuzhu/ThreeScreenShot.java
修改文件分类
1)frameworks/base/
2)packages/apps/Settings/
这个博客主要记录frameworks/base/相关的修改与实现 Settings模块的修改可以参考我从前的博客
Android N Settings实战开发(1)一,二级界面增加
https://blog.csdn.net/qq_24716151/article/details/78619044
Android N Settings实战开发(2)一级界面状态更新
https://blog.csdn.net/qq_24716151/article/details/78675743

二:实现原理

实现原理:
1)Settings中开关控制状态,
Settings.System.putInt(getActivity().getContentResolver(), Settings.System.SCREENSHOTPOINTER, 1);
0代表关,1代表开。
2)ViewGroup.java中的事件分发中增加parse3PointerScreenShot(ev)手势判断逻辑

public boolean dispatchTouchEvent(MotionEvent ev) {if (mInputEventConsistencyVerifier != null) {mInputEventConsistencyVerifier.onTouchEvent(ev, 1);}parse3PointerScreenShot(ev);Log.i("WHB11111","parse3PointerScreenShot-----PWM=");   ........}

3)parse3PointerScreenShot(ev)手势逻辑判断,如果符合逻辑发送截屏广播

private void parse3PointerScreenShot(MotionEvent ev) {int actionMasked = ev.getActionMasked();int pointerCount = ev.getPointerCount();//获取Settings中是否允许三指截屏,1为允许,非1为不允许//最好是在framework中加入int value = Settings.System.getInt(mContext.getContentResolver(), Settings.System.SCREENSHOTPOINTER, 0);Log.i("WHB11111","SCREENSHOTPOINTER="+value);if (value != 1) {return ;}if (pointerCount == 3) {switch (actionMasked) {case MotionEvent.ACTION_POINTER_DOWN:for (int i = 0; i < pointerCount; i++) {int pointerId = ev.getPointerId(i);downY[pointerId] = ev.getY(i);}is3Pointer = true;break;case MotionEvent.ACTION_POINTER_UP:if (is3Pointer) { //如果是三个手指,就获取每个手指的滑动间距,否则就清空数据for (int i = 0; i < pointerCount; i++) {int pointerId = ev.getPointerId(i);upY[pointerId] = ev.getY(i);matchY[pointerId] = Math.abs(upY[pointerId] - downY[pointerId]);}} else {clearArrayData(downY);clearArrayData(upY);clearArrayData(matchY);}break;default:break;}boolean[] flag = new boolean[] {false, false, false,};for (int i = 0; i < pointerCount; i++) {int pointerId = ev.getPointerId(i);//三个手指划过的距离是否大于最大预定值if (matchY[pointerId] > Y_OFFSET) {flag[i] = true;matchY[pointerId] = 0;}}//如果三个指头都划过了最大预定值,就开始截屏if (flag[0] && flag[1] && flag[2]) {Intent intent = new Intent("com.whb.screenshot");//Send broadcast to PhoneWindowManager to cature screengetContext().sendBroadcast(intent);Log.d(TAG, "Intercept the key Three finger to capture screen"); }} else {is3Pointer = false;}}

4)PhoneWindowManager接收广播实现截屏操作
注册广播

        filter = new IntentFilter("com.whb.screenshot");context.registerReceiver(mScreenShotReceiver, filter);

接收广播通过调用SystemUI的截图方法实现截图操作

    BroadcastReceiver mScreenShotReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if ("com.qucii.screenshot".equals(intent.getAction())) {Log.i("WHB11111","begin-----SCREENSHOTPOINTER=");mHandler.post(mScreenshotRunnable); // 调用系统代码,执行截屏逻辑}}};

如果想调用SystemUI的截图方法,要做如下修改

--- a/alps/frameworks/base/packages/SystemUI/AndroidManifest.xml
+++ b/alps/frameworks/base/packages/SystemUI/AndroidManifest.xml<service android:name=".screenshot.TakeScreenshotService"android:process=":screenshot"
-            android:exported="false" />
+            android:exported="true" /><!-- Called from PhoneWindowManager --><receiver android:name=".screenshot.ScreenshotServiceErrorReceiver"

三:解决ListView事件冲突

public boolean onInterceptTouchEvent(MotionEvent ev) {if (ev.isFromSource(InputDevice.SOURCE_MOUSE)&& ev.getAction() == MotionEvent.ACTION_DOWN&& ev.isButtonPressed(MotionEvent.BUTTON_PRIMARY)&& isOnScrollbarThumb(ev.getX(), ev.getY())) {return true;}
+       if (ev.getPointerCount()==3
+               &&Settings.System.getInt(mContext.getContentResolver(), +Settings.System.SCREENSHOTPOINTER, 0)==1) {
+           return true;
+           }return false;}

四:默认状态控制

1.frameworks/base/packages/SettingsProvider/res/values/defaults.xml设置默认指控制三指截屏操作是默认开还是关。
M alps/frameworks/base/core/java/android/provider/Settings.java
M alps/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
M alps/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
Settings.java

+          public static final String SCREENSHOTPOINTER = "screenshot_pointer";

DatabaseHelper.java

+          loadIntegerSetting(stmt, Settings.System.SCREENSHOTPOINTER,
+                                       R.integer.screenshot_pointer);

defaults.xml

+         <integer name="screenshot_pointer">0</integer>

2.编译遇到不过的时候

******************************
You have tried to change the API from what has been previously approved.
To make these errors go away, you have two choices:1) You can add "@hide" javadoc comments to the methods, etc. listed in theerrors above.2) You can update current.txt by executing the following command:make update-apiTo submit the revised current.txt to the main Android repository,you will need approval.
******************************

执行make update-api,并把相关的current.txt提交上

Android N版本 三指截屏相关推荐

  1. Android 基于4.4系统截屏的三指截屏

    根据上一篇文章Android 4.4系统原生截图解析 ,我们知道系统截屏是调用了TakeScreenshotService,为实现在任何界面都能实现三指截屏,我们就得在PhoneWindow(fram ...

  2. Android三指截屏的实现

    三指截屏是用户三个手机点击屏幕向下滑,最终调用systemui的截屏服务实现截屏.所以其他只是做一个策略的实现.目前很多不少手机都实现了该功能,因此自己也尝试着实现该功能.1.首先是注册事件,监听用户 ...

  3. Android三指截屏实现,一个简单的三指截屏功能实现

    最近做了很多客制化的Touch需求,很多情况都可以直接通过GestureDetector来完成,这里挑选三指截屏简述原理.先来说说主要思路,在view的onInterceptTouchEvent方法中 ...

  4. Android8.1 MTK平台 增加三指截屏(仿IOS左下角显示缩略图点击放大显示)

    效果图 修改后动画如下 系统原动画如下 三指截屏 PhoneWindowManager 同级目录下的 SystemGesturesPointerEventListener.java 主要负责处理界面的 ...

  5. SystemUI 三指截屏或Power键加音量键连续截屏比较慢

    不积跬步无以至千里 了解SystemUI模块的童鞋都知道截屏是处在SystemUI的代码逻辑中的,因此这里出现了截屏比较慢的问题,就是你连续的三指截屏或者power+音量键,但是不会去快速的截屏. 修 ...

  6. unity打包的apk无法三指截屏

    unity打包的apk无法三指截屏 环境 华为手机 问题 unity打包的游戏在手机上无法用三指截屏 原因 首先华为手机有一个应用助手 游戏空间的概念或者说是应用. 华为手机当判断此应用为游戏时,会将 ...

  7. 滚动截屏软件_华为指关节截屏不如三指截屏好用?一步到位,实践出真知

    华为手机的指关节截屏功能想必只要是用过的朋友都知道,熟悉的朋友更会以此为依赖,比如我,现在换了个其他品牌手机用,一到截屏的时候还是会不由自主地拿指关节划区截屏,因为指关节截屏不仅仅是双击截屏,这个划区 ...

  8. Mr.Alright---基于安卓O(8.0)三指截屏的实现

    介绍:使用这种方式下拉状态栏也可以截图,思路就是拦截触摸事件,判断是不是三指并且符合一定的距离,最后发送截屏的广播,代码如下,后面的代码没有修改 //alps/vendor/mediatek/prop ...

  9. android 8.1.0怎么截屏,vivo Z1i怎么截屏?4种vivo Z1i截图方法

    近日,vivo发布了第款Z系列手机--Z1i,简单来说就是vivo Z1的衍生版,存储空间升级到了128GB,不过处理器降为骁龙636,前置摄像头降为1600万像素,售价1898元,主打的是颜值.拍照 ...

最新文章

  1. COM如何区分套间线程(apartment thread)和自由线程(free thread)
  2. PHP获取IP的多种方式解析
  3. windows下配置opencv
  4. 交华为换机access配置_华为交换机VLAN内Proxy ARP配置示例
  5. java string rt_如何使jvm加载我的java.lang.String而不是rt.jar中的那个
  6. Mac homebrew报错Error: homebrew-core is a shallow clone.
  7. opengl 如何加阴影_一步步学OpenGL(23) -《阴影贴图1》
  8. Git廖雪峰 常用命令总结
  9. java 中国地图_Echarts+Java生成百度统计中国地图详细教程-Fun言
  10. leetcode 53. Maximum Subarray(DP动态规划问题)
  11. 双击div变成可编辑区的简单实现
  12. ES报错处理-mapper [xx.xx] of different type, current_type [text], merged_type [keyword]
  13. Snappy Installer
  14. 掘金企服:ICP经营许可证和ICP备案的区别 1
  15. 工作中有可能用到的运维小知识《现查现用》
  16. 联通云服务器怎么修改密码,桌面云使用说明
  17. PHP基础知识【大纲】
  18. 基于Nordic52832的六轴HID蓝牙鼠标开发
  19. 4K电视与4K显示器区别?对比测试!
  20. Lora SX1278芯片 模块引脚的功能介绍

热门文章

  1. 商城 mysql语句_简单商城的数据库建表sql
  2. MATLAB robotics tools工具箱下载安装
  3. WebSocket使用(JS)
  4. 介绍一款自己开发的工具类小程序:方包工具箱
  5. DDL DML DCL TCL
  6. 岁月的剪影【二月回来】
  7. FireEye:恶意软件家族拥有共同的起源
  8. Linux报Resource temporarily unavailable问题解决方案
  9. python list,dict操作
  10. python采集shipin及评论数据并作自动点赞操作~