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() {
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在uniapp中使用u-tabs实现手指滑动切换功能,可以通过监听touch事件来实现。 首先,在u-tabs组件上添加一个touchstart事件,获取手指初始位置。然后在touchmove事件中获取手指移动距离,通过计算距离和方向,判断是向左滑动或向右滑动。最后在touchend事件中根据滑动方向来判断是否需要切换tab。 以下是一个示例代码: ```html <template> <view> <u-tabs @touchstart="onTouchStart" @touchmove="onTouchMove" @touchend="onTouchEnd"> <u-tab title="Tab 1">Content 1</u-tab> <u-tab title="Tab 2">Content 2</u-tab> <u-tab title="Tab 3">Content 3</u-tab> </u-tabs> </view> </template> <script> export default { data() { return { startX: 0, // 手指初始位置 moveX: 0, // 手指移动距离 direction: '', // 滑动方向 activeIndex: 0 // 当前激活的tab索引 } }, methods: { onTouchStart(e) { this.startX = e.changedTouches[0].pageX }, onTouchMove(e) { this.moveX = e.changedTouches[0].pageX - this.startX // 判断滑动方向 if (this.moveX > 0) { this.direction = 'right' } else { this.direction = 'left' } }, onTouchEnd() { if (Math.abs(this.moveX) > 50) { // 判断滑动距离是否超过50px,超过则切换tab if (this.direction === 'right') { this.activeIndex = Math.max(0, this.activeIndex - 1) } else if (this.direction === 'left') { this.activeIndex = Math.min(this.$refs.tabs.children.length - 1, this.activeIndex + 1) } } // 清空手指移动距离和方向 this.moveX = 0 this.direction = '' } } } </script> ``` 在上面的示例代码中,我们通过监听touchstart、touchmove和touchend事件来实现手指滑动切换tab的功能。其中,onTouchStart方法用于获取手指初始位置,onTouchMove方法用于获取手指移动距离,并判断滑动方向,onTouchEnd方法用于根据滑动方向切换tab。需要注意的是,为了避免误操作,我们判断滑动距离是否超过50px才会触发切换tab的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值