Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

7.10. 屏幕

7.10.1. 尺寸

		
        Resources resource = this.getResources();
        DisplayMetrics displayMetrics = resource.getDisplayMetrics();

        Log.d(TAG, "getCurrentWindowMetrics: " + displayMetrics.toString());		
		
		
		
getCurrentWindowMetrics: DisplayMetrics{density=1.5, width=1536, height=1964, scaledDensity=1.9499999, xdpi=240.0, ydpi=240.0}		
		
		

7.10.2. 全屏显示

		
        WindowInsetsController controller = getWindow().getDecorView().getWindowInsetsController();
        controller.hide(WindowInsets.Type.statusBars());
        controller.hide(WindowInsets.Type.navigationBars());
        controller.hide(WindowInsets.Type.systemBars());
		
		
		
    public static void fullscreen(View view) {
        WindowInsetsController controller = view.getWindowInsetsController();
        controller.hide(WindowInsets.Type.statusBars());
        controller.hide(WindowInsets.Type.navigationBars());
        controller.hide(WindowInsets.Type.systemBars());
    }
    
# 主屏调用 MainActivity
fullscreen(this.getWindow().getDecorView().getRootView());

# Fragment 中调用
fullscreen(getActivity().getWindow().getDecorView().getRootView());
		
		

7.10.3. 屏幕触摸事件 onTouch(View view, MotionEvent motionEvent)

7.10.3.1. 

			
    private final View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch (motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN:

                    break;
                case MotionEvent.ACTION_UP:
                    view.performClick();
                    break;
                default:
                    break;
            }
            return false;
        }
    };			
			
			

7.10.3.2. 屏幕触摸事件 onTouchEvent(MotionEvent event)

		
    private float x;
    private float y;
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                x = event.getX();
                y = event.getY();
                Log.d("Motion", "ACTION_DOWN-> X: " + x + "," + "Y: " + y);
                break;
            case MotionEvent.ACTION_UP:
                Log.d("Motion", "ACTION_UP-> X: " + event.getX() + ", Y: " + event.getY());
                if (event.getX() - x > 60) {
                    Log.d("Motion", "从左至右滑动: ➡️");
                }
                if (x - event.getX() > 60) {
                    Log.d("Motion", "从右至左滑动:⬅️");
                }

                if (y - event.getY() > 60) {
                    Log.d("Motion", "从下至上滑动:⬆️");
                }

                if (event.getY() - y > 60) {
                    Log.d("Motion", "从上至下滑动:⬇️");
                }
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d("Motion", "ACTION_MOVE-> X: " + event.getX() + ", Y: " + event.getY());
                break;
        }
        return false;
    }		
		
			

7.10.4. 手势事件

		
        gridView = (GridView) findViewById(R.id.gridView);

        GestureDetector gestureDetector = new GestureDetector(this, new MyGesture());
        gridView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // Log.e("MainActivity", event.getX()+"");
                return gestureDetector.onTouchEvent(event);
            }
        });		
		
		
		

    public class MyGesture implements GestureDetector.OnGestureListener {


        public MyGesture() {

        }

        // 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
        public boolean onDown(MotionEvent arg0) {
            Log.i("MyGesture", "onDown");
            Toast.makeText(PictureBookFullscreenActivity.this, "onDown", Toast.LENGTH_SHORT).show();
            return true;
        }

        /*
         * 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
         * 注意和onDown()的区别,强调的是没有松开或者拖动的状态
         */
        public void onShowPress(MotionEvent e) {
            Log.i("MyGesture", "onShowPress");
            Toast.makeText(PictureBookFullscreenActivity.this, "onShowPress", Toast.LENGTH_SHORT).show();
        }

        // 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
        public boolean onSingleTapUp(MotionEvent e) {
            Log.i("MyGesture", "onSingleTapUp");
            Toast.makeText(PictureBookFullscreenActivity.this, "onSingleTapUp", Toast.LENGTH_SHORT).show();
            return true;
        }

        // 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            Log.i("MyGesture", "onFling");
            Toast.makeText(PictureBookFullscreenActivity.this, "onFling", Toast.LENGTH_LONG).show();
            if (velocityX > -50) {
                startActivity(new Intent(PictureBookFullscreenActivity.this, ShareFullscreenActivity.class));
            }
            if (velocityX > 50) {
                startActivity(new Intent(PictureBookFullscreenActivity.this, FavoritesFullscreenActivity.class));
            }
            return true;
        }

        // 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            Log.i("MyGesture", "onScroll e1: " + e1.getX() + " e2: " + e2.getX() + " distanceX: " + distanceX + " distanceY: " + distanceY);
            Toast.makeText(PictureBookFullscreenActivity.this, "onScroll", Toast.LENGTH_LONG).show();
            return true;
        }

        // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
        public void onLongPress(MotionEvent e) {
            Log.i("MyGesture", "onLongPress");
            Toast.makeText(PictureBookFullscreenActivity.this, "onLongPress", Toast.LENGTH_LONG).show();
        }
    }
		
		
		

7.10.5. SimpleOnGestureListener

		

    private final View.OnTouchListener touchListener = new View.OnTouchListener() {
        MySimpleOnGestureListener mySimpleOnGestureListener = new MySimpleOnGestureListener();
        GestureDetector gestureDetector = new GestureDetector(getContext(), mySimpleOnGestureListener);

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
//            Log.d(TAG, "MotionEvent " + motionEvent.toString());
            gestureDetector.onTouchEvent(motionEvent);

            // true: 持续监听,false: 消费一次便退出
            return true;
        }
    };

    private class MySimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onSingleTapUp(@NonNull MotionEvent e) {
            Log.d(TAG, "MySimpleOnGestureListener onSingleTapUp");
            return super.onSingleTapUp(e);
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            // 处理上下滑动事件
            // 根据distanceY的值来调整ImageView的位置
            // 返回true表示消费了该事件
            Log.d(TAG, "MySimpleOnGestureListener distanceX: " + distanceX + " distanceY: " + distanceY);
            if (distanceY > 1) {
                Log.d(TAG, "MySimpleOnGestureListener onScroll UP");
            } else {
                Log.d(TAG, "MySimpleOnGestureListener onScroll Down");
            }
            if (distanceX > 1) {
                Log.d(TAG, "MySimpleOnGestureListener onScroll Left");
            } else {
                Log.d(TAG, "MySimpleOnGestureListener onScroll Right");
            }
            return false;
        }

        @Override
        public void onShowPress(@NonNull MotionEvent e) {
            Log.d(TAG, "MySimpleOnGestureListener onShowPress");
            super.onShowPress(e);
        }

        @Override
        public void onLongPress(@NonNull MotionEvent e) {
            Log.d(TAG, "MySimpleOnGestureListener onLongPress");
            super.onLongPress(e);
        }

        @Override
        public boolean onFling(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float velocityX, float velocityY) {
            if (velocityY < 2000) {
                Log.d(TAG, "MySimpleOnGestureListener onFling UP");
            } else {
                Log.d(TAG, "MySimpleOnGestureListener onFling Down");
            }
            if (velocityX < 2000) {
                Log.d(TAG, "MySimpleOnGestureListener onFling Left");
            } else {
                Log.d(TAG, "MySimpleOnGestureListener onFling Right");
            }
            Log.d(TAG, "MySimpleOnGestureListener onFling velocityX: " + velocityX + " velocityY: " + velocityY);
            return super.onFling(e1, e2, velocityX, velocityY);
        }

        @Override
        public boolean onSingleTapConfirmed(@NonNull MotionEvent e) {
            Log.d(TAG, "MySimpleOnGestureListener onSingleTapConfirmed");
            return super.onSingleTapConfirmed(e);
        }

        @Override
        public boolean onDown(@NonNull MotionEvent e) {
            Log.d(TAG, "MySimpleOnGestureListener onDown");
            return super.onDown(e);
        }
    }		
		
		

onScroll 按下后触发,持续获取坐标

onFling 按下滑动,手指抬起后触发

7.10.5.1. 上下滑动

			
		@Override
        public boolean onFling(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float velocityX, float velocityY) {

            int direction = (int) (e1.getY() - e2.getY());
            if (direction > 0) {
                if (rangeInDefined(direction, 250, 450)) {
                    page += 10;
                } else if (rangeInDefined(direction, 450, 800)) {
                    page += 50;
                } else if (rangeInDefined(direction, 800, 1500)) {
                    page += 100;
                } else {
                    page++;
                }

                page = page > totalPages ? totalPages : page;
            }

            if (direction < 0) {
                if (rangeInDefined(Math.abs(direction), 250, 450)) {
                    page -= 10;
                } else if (rangeInDefined(Math.abs(direction), 450, 800)) {
                    page -= 50;
                } else if (rangeInDefined(Math.abs(direction), 800, 1500)) {
                    page -= 100;
                } else {
                    page--;
                }
                page = page <= 0 ? 0 : page;
            }

            if (direction > 10) {
//                Log.d(TAG, "MySimpleOnGestureListener onFling UP");
                picture.next(page, storyConsumer);
            } else {
//                Log.d(TAG, "MySimpleOnGestureListener onFling Down");
                picture.previous(page, storyConsumer);
            }
            Log.d(TAG, "Y1 " + e1.getY() + " Y2 " + e2.getY() + " = " + direction);
//            Log.d(TAG, "MySimpleOnGestureListener Direction: " + direction + " Page: " + page);
            return super.onFling(e1, e2, velocityX, velocityY);
        }			
			
			

7.10.5.2. 双击事件

			
        @Override
        public boolean onDoubleTap(@NonNull MotionEvent e) {
            Log.d(TAG, "MySimpleOnGestureListener onDoubleTap");
            picture.click(picture.id, Picture.Button.LIKES, true, clickConsumer);
            return super.onDoubleTap(e);
        }			
			
			

7.10.6. SimpleOnScaleGestureListener

		
    private class MyScaleGestureListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            // 处理缩放事件
            // 根据detector.getScaleFactor()的值来调整ImageView的缩放比例
            // 返回true表示消费了该事件
            return true;
        }
    }
    
    		
		
		
		
    private final View.OnTouchListener touchListener = new View.OnTouchListener() {
        MyScaleGestureListener scaleGestureListener = new MyScaleGestureListener();
    	ScaleGestureDetector scaleGestureDetector = new ScaleGestureDetector(getContext(), scaleGestureListener);

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
//            Log.d(TAG, "MotionEvent " + motionEvent.toString());
              scaleGestureDetector.onTouchEvent(motionEvent);
            // true: 持续监听,false: 消费一次便退出
            return true;
        }
    };