frameworks/base/core/java/com/android/internal/policy/MultiGestureSupport/MultiGestureMonitor.java //新增的类

frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java

原文地址:http://blog.csdn.net/yelangjueqi/article/details/56275913

源码

1 MultiGestureMonitor.java //多指检测类

package com.example.android;import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;/*** Multi Finger Screenshot Gesture Monitor** @hide*/
public class MultiGestureMonitor {private static final String TAG = "FingerScreenShotGesture/" + MultiGestureMonitor.class.getSimpleName();private final String TAG_EVENT = TAG + "/EventPoint";private boolean DBG = false;private boolean isSupportHorizontalSlide = true;public static final String ACTION_MULTI_FINGER_SCREEN_SHOT = "android.intent.action.MULTI_FINGER_SCREEN_SHOT";public static final String MULTI_FINGER_SCREEN_SHOT_ENABLED = "multi_finger_screen_shot_enabled";private final int SUPPORT_FINGER_COUNTS = 3;private final int HORIZONTAL_SLIDE_OFFSET_DISTANCEY = 300;private final int HORIZONTAL_SLIDE_OFFSET_DISTANCEX = 160;private final int VERTICAL_SLIDE_OFFSET_DISTANCEY = 160;private final int VERTICAL_SLIDE_OFFSET_DISTANCEX = 80;private final float BASEVELOCOTY = 45;private int mode;private float mOldx0;private float mOldy0;private float mOldx1;private float mOldy1;private float mOldx2;private float mOldy2;private float mVelocityX0;private float mVelocityY0;private Context mContext;private VelocityTracker mVelocityTracker;private boolean mFingerScreenShotEnabled = false;private boolean getFingerEnable() {int mFingerMode = Settings.System.getInt(mContext.getContentResolver(), MULTI_FINGER_SCREEN_SHOT_ENABLED, 0);if (mFingerMode == 1) {return true;} else {return false;}}// private static MultiGestureMonitor sInstance;//// public static MultiGestureMonitor getInstance(Context context) {// if (sInstance == null) {// sInstance = new MultiGestureMonitor(context);// }// return sInstance;// }public MultiGestureMonitor(Context context) {mContext = context;}public boolean onTouchEvent(MotionEvent event) {boolean handled = false;int action = event.getAction();switch (action & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();} else {mVelocityTracker.clear();}mVelocityTracker.addMovement(event);mode = 1;break;case MotionEvent.ACTION_MOVE:if (mVelocityTracker != null) {mVelocityTracker.addMovement(event);mVelocityTracker.computeCurrentVelocity(1000);mVelocityX0 = mVelocityTracker.getXVelocity();mVelocityY0 = mVelocityTracker.getYVelocity();}break;case MotionEvent.ACTION_POINTER_DOWN:mode += 1;if (mode == SUPPORT_FINGER_COUNTS) {mFingerScreenShotEnabled = getFingerEnable();try {mOldx0 = event.getX(event.getPointerId(0));mOldy0 = event.getY(event.getPointerId(0));mOldx1 = event.getX(event.getPointerId(1));mOldy1 = event.getY(event.getPointerId(1));mOldx2 = event.getX(event.getPointerId(2));mOldy2 = event.getY(event.getPointerId(2));if (DBG) {Log.v(TAG_EVENT, "oldx0:" + mOldx0 + ",oldy0:" + mOldy0 + ",oldx1:" + mOldx1 + ",oldy1:"+ mOldy1 + ",mOldx2=" + mOldx2 + ",mOldy2=" + mOldy2);}} catch (IllegalArgumentException e) {e.printStackTrace();}}break;case MotionEvent.ACTION_POINTER_UP:if (mode == SUPPORT_FINGER_COUNTS) {if (!mFingerScreenShotEnabled) {return false;}try {float newx0 = event.getX(event.getPointerId(0));float newy0 = event.getY(event.getPointerId(0));float newx1 = event.getX(event.getPointerId(1));float newy1 = event.getY(event.getPointerId(1));float newx2 = event.getX(event.getPointerId(2));float newy2 = event.getY(event.getPointerId(2));if (DBG) {Log.d(TAG_EVENT,"newx0:" + (Math.abs(newx0 - mOldx0) > HORIZONTAL_SLIDE_OFFSET_DISTANCEX) + ",newy0:"+ (Math.abs(newy0 - mOldy0) < HORIZONTAL_SLIDE_OFFSET_DISTANCEY) + ",newx1:"+ (Math.abs(mVelocityX0) > BASEVELOCOTY) + ",newy1:"+ (Math.abs(newy0 - mOldy0) > VERTICAL_SLIDE_OFFSET_DISTANCEY) + ",newx2="+ (Math.abs(newx0 - mOldx0) < VERTICAL_SLIDE_OFFSET_DISTANCEX) + ",newy2="+ (Math.abs(mVelocityY0) > BASEVELOCOTY));Log.d(TAG_EVENT, "mVelocityX0=" + mVelocityX0 + ",mVelocityY0=" + mVelocityY0);}if (isSupportHorizontalSlide) {if (Math.abs(newx0 - mOldx0) > HORIZONTAL_SLIDE_OFFSET_DISTANCEX&& Math.abs(newy0 - mOldy0) < HORIZONTAL_SLIDE_OFFSET_DISTANCEY&& Math.abs(mVelocityX0) > BASEVELOCOTY) {notifyScreenshotGestureCompleted();}} else {if (Math.abs(newy0 - mOldy0) > VERTICAL_SLIDE_OFFSET_DISTANCEY&& Math.abs(newx0 - mOldx0) < VERTICAL_SLIDE_OFFSET_DISTANCEX&& Math.abs(mVelocityY0) > BASEVELOCOTY) {notifyScreenshotGestureCompleted();}}} catch (IllegalArgumentException e) {e.printStackTrace();}}mode -= 1;break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:Log.v(TAG, "ACTION_UP or ACTION_CANCEL");mode = 0;if (mVelocityTracker != null) {mVelocityTracker.recycle();mVelocityTracker = null;}resetToInitValue();break;}Log.v(TAG, TAG + String.valueOf(handled));return handled;}private void notifyScreenshotGestureCompleted() {if (mContext != null) {Intent intent = new Intent();intent.setAction(ACTION_MULTI_FINGER_SCREEN_SHOT);mContext.sendBroadcast(intent);Log.d(TAG, "sendBroadcast:" + ACTION_MULTI_FINGER_SCREEN_SHOT);}}private void resetToInitValue() {mOldx0 = 0;mOldy0 = 0;mOldx1 = 0;mOldy1 = 0;mOldx2 = 0;mOldy2 = 0;}
}

说明:

该类为多指手势检测的关键类,具体支持几个手指截屏,由常亮"SUPPORT_FINGER_COUNTS"控制,此处为3,即三指截屏

A,MULTI_FINGER_SCREEN_SHOT_ENABLED = "multi_finger_screen_shot_enabled" 为三指截屏的控制开关

B,满足三指滑动手势后调用notifyScreenshotGestureCompleted()方法发送Action到PhoneWindowManager类,调用takeScreenshot()进行截屏

2 PhoneWindow.java

PhoneWindow类修改如下,见高亮部分代码:

public PhoneWindow(Context context) {
        super(context);
        mLayoutInflater = LayoutInflater.from(context);

initFingerScreenshot();
    }

......

private final String TAG_FINGER = "/FingerScreenShotGesture";
    private boolean DBG = true;
    private MultiGestureMonitor mMultiGestureMonitor;
    private int mFingerScreenShotEnabled = 0;
    private final String MULTI_FINGER_SCREEN_SHOT_ENABLED = MultiGestureMonitor.MULTI_FINGER_SCREEN_SHOT_ENABLED;

private void initFingerScreenshot() {
        mMultiGestureMonitor = new MultiGestureMonitor(getContext());
    }

private boolean isSupportFingerScreenshot() {
        return Settings.System.getInt(getContext().getContentResolver(),
                MULTI_FINGER_SCREEN_SHOT_ENABLED, 0) == 1;
    }

......

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
            if (mMultiGestureMonitor != null) {
                boolean ishanded = mMultiGestureMonitor.onTouchEvent(ev);
                if (DBG) Log.v(TAG, "dispatchTouchEvent:" + String.valueOf(ishanded));
                if (ishanded) {
                    return true;
                }
            }

final Callback cb = getCallback();
            return cb != null && !isDestroyed() && mFeatureId < 0 ? cb.dispatchTouchEvent(ev)
                    : super.dispatchTouchEvent(ev);
     }

【Android M】平台方实现三指左右滑动任何应用界面截屏相关推荐

  1. Android 8.0 学习 (26)---Android8.0 Power Menu 添加截屏选项

    首先介绍下这个Power长按,显示Power Menu的流程,然后再介绍如何去添加一个新的选项,新的选项的功能是截屏. Power Menu长按的流程:  1.长按Power的处理在framework ...

  2. l36h android 4.4,推送在即?索尼L36h升级安卓4.4截屏流出

    在2月的MWC2014开始之前我们就看到了索尼旗下多款机型可能升级到Android 4.4的消息,不过几个月的时间过去了,推送还没有开始.而现在有截图显示版本号为10.5.A.0.227的固件升级将会 ...

  3. android 8.1 截屏,Android8.1 MTK平台 截屏功能分析

    前言 涉及到的源码有 frameworksbaseservicescorejavacomandroidserverpolicyPhoneWindowManager.java vendormediate ...

  4. android悬浮球截屏,ColorOS7的悬浮球截屏和长截屏怎么用,有哪些方式

    11月20日OPPO官方发布了这个全新的ColorOS 7系统了,在发布会上展现了很多惊艳的功能,但是对于操作便捷来说,我最喜欢的还是截屏方式的改变,变得花样更多了,相信这个截屏在大家使用手机的过程中 ...

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

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

  6. 小米android截屏快捷键是什么原因,你知道么,小米手机的截屏方式居然有5种!...

    原标题:你知道么,小米手机的截屏方式居然有5种! 都知道小米手机受欢迎的其中一个重要因素是小米的MIUI系统,MIUI系统可以说是最符合国人操作.最人性化的基于Android系统深度优化.定制.开发的 ...

  7. android 手机如何截图,原来安卓手机有这么多种截屏方式 最后两种一般人不会用...

    原标题:原来安卓手机有这么多种截屏方式 最后两种一般人不会用 在这个信息化的时代,智能手机几乎主宰着天下,人人手中一部智能机 .看新闻,听歌曲,打游戏.我们的日常几乎全部由手机霸占着.但截屏作为初级的 ...

  8. shell 截屏 android,Android 使用Shell脚本截屏并自动传到电脑上

    Android 使用Shell脚本截屏并自动传到电脑上 Android设备用久了,截屏是个麻烦事.更麻烦的是通过qq传到电脑上,倒腾半天.其实用adb命令就可以截屏,然后写个pull的语句就可以拉到电 ...

  9. Android截屏与WebView长图分享经验总结【转】

    原文:https://youzanmobile.github.io/2017/05/19/android-screenshot-and-webview/ 最近在做新业务需求的同时,我们在 Androi ...

最新文章

  1. 数据库表DML操作不了 可能是被锁了
  2. AI公开课:19.05.22 Aya Soffer—IBM AI Tech VP《Advanced, scalable, and trusted AI 》课堂笔记以及个人感悟
  3. iOS UIKit:UITableView
  4. HDU - 7031 Power Station of Art 思维 + 二分图模型
  5. 数模写作必备利器—latex
  6. Service实现文件下载
  7. Python PyPI中国镜像
  8. python chmod 批量 os_Python3 os.lchmod() 方法
  9. 没有php5.sowenjian_(转)LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例...
  10. 一招教你轻松恢复丢失的MP4视频
  11. java ajax json 乱码_ajax请求返回200,json中文乱码怎么破?
  12. 内置式永磁同步电机IPMSM,最大转矩电流比MTPA控制仿真模型
  13. 极客书的编程教程合集
  14. 图片导入ppt后模糊_PPT另存为图片不清晰|为什么PPT导出图片不清晰
  15. 3D目标检测评估标准
  16. 经典推荐:盛大架构师周爱民回顾职业历程,分享十项建议
  17. 清华大学计算机系人才流失,大量中国人才流失,科研被国外扼住喉咙,清华等8所高校忍不住了...
  18. margin-top、top、以及position的总结
  19. Java使用AES/EBC/PKCS5Padding加密,CryptoJS解密错误
  20. 年龄 计算 php,php简单计算年龄的方法(周岁与虚岁)

热门文章

  1. Spring常用注解(收藏大全)
  2. 逆战班带你认识ES6
  3. 林志玲19岁清纯照曝光(组图)
  4. 快手校招java一面凉经,快手电商生态Java实习一面(凉)
  5. millenium panel 怎么汉化?millenium panel汉化版安装方法
  6. 培训班出来的人后来都怎么样了?(七)
  7. (转)C语言家族扩展
  8. 数据治理的 “独孤九剑”
  9. 2021/9/28 python学习笔记:np.argmax、np.delete
  10. 全网最新的Fiddler(3):fiddler界面工具栏介绍