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

7.10. 屏幕

7.10.1. 

		
        DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
        Display[] displays = displayManager.getDisplays();
        for (Display display : displays) {
            Log.d(TAG, String.valueOf(display.getDisplayId()));
//            if (display.getType() == Display.TYPE_HDMI) {
//                // 处理HDMI显示逻辑
//            }
        }
		
		
		
 	DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
	Display[] displays = displayManager.getDisplays();
	for (Display display : displays) {
		if (display.getType() == Display.TYPE_HDMI) {
		    Surface surface = display.getSurface();
		    mediaPlayer.setSurface(surface);
		}
	}
		
		

7.10.2. 媒体路由

		
	MediaRouter mediaRouter = (MediaRouter) getSystemService(Context.MEDIA_ROUTER_SERVICE);
   	MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
   	if (route != null) {
       // 处理视频路由逻辑
   	}
		
		

7.10.3. 分辨率

		
Display display = displayManager.getDisplay(Display.DEFAULT_DISPLAY);
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
		
		

7.10.4. 尺寸

		
        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.5. 全屏显示

		
        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.6. 音频处理

		
AudioTrack audioTrack = new AudioTrack(
	AudioManager.STREAM_MUSIC,
	sampleRate,
	AudioFormat.CHANNEL_OUT_STEREO,
	AudioFormat.ENCODING_PCM_16BIT,
	bufferSize,
	AudioTrack.MODE_STREAM
);
audioTrack.play();		
		
		

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

7.10.7.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.7.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;
    }		
		
			
			
        binding.imageView.setOnTouchListener(new View.OnTouchListener() {
            private TouchEvent.Point downPoint;
            private TouchEvent.Point upPoint;

            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
//                Log.d(TAG, motionEvent.toString());
                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        downPoint = new TouchEvent.Point(motionEvent.getX(), motionEvent.getY());
                        Log.d("MotionEvent", "ACTION_DOWN: " + downPoint);
                        break;
                    case MotionEvent.ACTION_UP:
                        upPoint = new TouchEvent.Point(motionEvent.getX(), motionEvent.getY());
                        Log.d("MotionEvent", "ACTION_UP: " + upPoint);
                        if (downPoint.getY() - upPoint.getY() > 100) {

                            aigc.next();
                            Log.d("MotionEvent", "UP: " + upPoint);
                        } else if (upPoint.getY() - downPoint.getY() > 100) {


                            aigc.previous();
                            Log.d("MotionEvent", "DOWN: " + upPoint);
                        } else if (downPoint.getX() - upPoint.getX() > 100) {
//                    Toast.makeText(MainActivity.this, "共享作品", Toast.LENGTH_SHORT).show();
                            Log.d("MotionEvent", "LEFT: " + upPoint);
//                    Intent intent = new Intent(MainActivity.this, ShareFullscreenActivity.class);
//                    startActivity(intent);

                        } else if (upPoint.getX() - downPoint.getX() > 100) {
                            Log.d("MotionEvent", "RIGHT: " + upPoint);
//                            aigc.latest();
//                            PictureSkillComponent.say("进入轮播");
                        } else {
                            if (audio != null) {
                                aigcSpeech.Player().play(audio, binding.progressBar, binding.storyToggleButtonPlayer);
                                Log.d(TAG, "重播: " + audio);
                            }
                        }
                        break;
                    case MotionEvent.ACTION_MOVE:
//                        fullscreen(getActivity().getWindow().getDecorView().getRootView());
                        break;
                }

                return false;
            }
        });
			
			

7.10.8. 手势事件

		
        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.9. 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.9.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.9.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.9.3. 通过手指滑动举例,实现倍数翻页

			
    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) {
            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) {

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

                page = page > totalPages ? totalPages - 1 : page;
            }

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

            if (Math.abs(direction) > 50) {
//                Log.d(TAG, "MySimpleOnGestureListener onFling UP");
                picture.discovery(page, storyConsumer);
            }

            Log.d(TAG, "Current page: " + page);
            Config.State.page = page;

            return super.onFling(e1, e2, velocityX, velocityY);
        }

        @Override
        public boolean onSingleTapConfirmed(@NonNull MotionEvent e) {
            Log.d(TAG, "MySimpleOnGestureListener onSingleTapConfirmed");
            picture.discovery(Config.State.page, storyConsumer);
            return super.onSingleTapConfirmed(e);
        }

        @Override
        public boolean onDown(@NonNull MotionEvent e) {
            Log.d(TAG, "MySimpleOnGestureListener onDown");
            binding.profileFrameLayout.setVisibility(View.INVISIBLE);
//            binding.viewSwitcher.setVisibility(View.VISIBLE);
//            binding.tabLayout.getTabAt(0).select();
            return super.onDown(e);
        }

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

7.10.10. 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;
        }
    };