android 添加屏幕滑动截屏功能

① * /frameworks/base/core/java/android/view/View.java

	+import android.view.WindowManager;
    +import android.util.DisplayMetrics;
    +import android.view.Display;
    
    //add for screen shot 
    protected int shotX;
    private boolean isShot=false;
    private float orgX1=0;
    private float orgX2=0;
    private long downTime=0;
    // add end

	public boolean dispatchTouchEvent(MotionEvent event) {
		...
		if (onFilterTouchEventForSecurity(event)) {
			if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
                result = true;
            }
            //noinspection SimplifiableIfStatement
            ListenerInfo li = mListenerInfo;
            if (li != null && li.mOnTouchListener != null
                    && (mViewFlags & ENABLED_MASK) == ENABLED
                    && li.mOnTouchListener.onTouch(this, event)) {
                /// M : add log to help debugging
                if (ViewDebugManager.DEBUG_TOUCH) {
                    ViewDebugManager.getInstance().debugEventHandled(this, event, li.toString());
                }
                result = true;
            }
			//add for screen shot
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                 case MotionEvent.ACTION_DOWN:
                      final int pointerCount = event.getPointerCount();
                      if (pointerCount == 1){
                          orgX1 = 0;
                          orgX2 = 0;
                          isShot = false;
                      } else {
                          if (!isShot) {
                              if ((event.getX(0) > shotX) && (event.getX(1) > shotX)) {
                                   orgX1 = event.getX(0);
                                   orgX2 = event.getX(1);
                                   isShot = true;
                              }
                          }
                      }
                      break;
                 case MotionEvent.ACTION_MOVE:
                      if (event.getPointerCount() >= 2) {
                          if (!isShot) {
                              if ((event.getX(0) > shotX) && (event.getX(1) > shotX)) {
                                   orgX1 = event.getX(0);
                                   orgX2 = event.getX(1);
                                   isShot = true;
                              }
                          } else {
                              if ((orgX1 - event.getX(0)) > 150 && (orgX2 - event.getX(1) > 150)) {
                                   Intent intent = new Intent("android.intent.action.SCREEN_SHOT");
                                   mContext.sendBroadcast(intent);
                                   orgX1 = 0;
                                   orgX2 = 0;
                              }
                          }
                      }
                      break;
             }

             if (isShot) {
                 result = true;
             }
             // add end
             if (!result && onTouchEvent(event)) {
                /// M : add log to help debugging
                if (ViewDebugManager.DEBUG_TOUCH) {
                    ViewDebugManager.getInstance().debugEventHandled(this,
                            event, "onTouchEvent");
                }
                result = true;
             }
        }
	}
	...
	@CallSuper
     protected void onFinishInflate() {
       // add for screen shot
       DisplayMetrics metrics = new DisplayMetrics();
       WindowManager WM = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
       Display display = WM.getDefaultDisplay();
       display.getMetrics(metrics); 
       int width = metrics.widthPixels;
       shotX = width - 30;
       // add end
    }

② * /frameworks/base/core/java/android/view/ViewGroup.java

	+import android.util.DisplayMetrics;
	+import android.view.WindowManager;
	...
	 //add for screen shot 
     private float groupOrgX1=0;
     private float groupOrgX2=0;
     private boolean isInterupt=false;
     private float interupPointX=0;
     private Context viewgroupContext;
     // add end

	 public ViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);

+        viewgroupContext = context;
         initViewGroup();
         initFromAttributes(context, attrs, defStyleAttr, defStyleRes);
     }
     ...
     @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
	 	if (onFilterTouchEventForSecurity(ev)) {
            // add for screen shot
             switch (ev.getAction() & MotionEvent.ACTION_MASK) {
                 case MotionEvent.ACTION_DOWN:
                     DisplayMetrics metrics = new DisplayMetrics();
                     WindowManager WM = (WindowManager) viewgroupContext.getSystemService(Context.WINDOW_SERVICE);
                     Display display = WM.getDefaultDisplay();
                     display.getMetrics(metrics);
                     int width = metrics.widthPixels;
                     interupPointX = width - 30;

                     final int pointerCount = ev.getPointerCount();
                     if (pointerCount == 1){
                         groupOrgX1 = 0;
                         groupOrgX2 = 0;
                         isInterupt = false;
                     } else {
                         if (!isInterupt) {
                            if ((ev.getX(0) > interupPointX) && (ev.getX(1) > interupPointX)) {
                                 groupOrgX1 = ev.getX(0);
                                 groupOrgX2 = ev.getX(1);
                                 isInterupt = true;
                            }
                        }
                    }
                    break;
				case MotionEvent.ACTION_MOVE:
                     if (ev.getPointerCount() >= 2) {
                         if (!isInterupt) {
                            if ((ev.getX(0) > interupPointX) && (ev.getX(1) > interupPointX)) {
                                 groupOrgX1 = ev.getX(0);
                                 groupOrgX2 = ev.getX(1);
                                 isInterupt = true;
                            }
                         } else {
                            if ((groupOrgX1 - ev.getX(0) > 150) && (groupOrgX2 - ev.getX(1) > 150)) {
                                 Intent intent = new Intent("android.intent.action.SCREEN_SHOT");
                                 mContext.sendBroadcast(intent);
                                 groupOrgX1 = 0;
                                 groupOrgX2 = 0;
                            }
                        }
                    }
                    break;
            }

            if (isInterupt) {
                return true;
            }
            // add end

            final int action = ev.getAction();
            final int actionMasked = action & MotionEvent.ACTION_MASK;
            ...
	 }
	 ...
	 public boolean onInterceptTouchEvent(MotionEvent ev) {
        //add for screen shot 
        if (isInterupt) {
            return true;
        }
        //add end

③ * /frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

	 @Override
     public void init(Context context, IWindowManager windowManager,
             WindowManagerFuncs windowManagerFuncs) {
        ...
 		// add for screen shot
        IntentFilter screenShotFilter=new IntentFilter();
        screenShotFilter.addAction("android.intent.action.SCREEN_SHOT");
        context.registerReceiver(mScreenShotReceiver, screenShotFilter);
        //add end

        /// M: MTK STK feature @{
        mStkManager.registerStkReceiver(context);
        ...
	}
	...
    //add for screen shot
    BroadcastReceiver mScreenShotReceiver = new BroadcastReceiver(){
         public void onReceive(Context context,Intent intent){
             String action=intent.getAction();
             takeScreenshot(TAKE_SCREENSHOT_FULLSCREEN);
         }
    };
    //add end 

    BroadcastReceiver mDreamReceiver = new BroadcastReceiver() {
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值