知乎专栏 |
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); } }
MediaRouter mediaRouter = (MediaRouter) getSystemService(Context.MEDIA_ROUTER_SERVICE); MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO); if (route != null) { // 处理视频路由逻辑 }
Display display = displayManager.getDisplay(Display.DEFAULT_DISPLAY); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y;
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}
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());
AudioTrack audioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM ); audioTrack.play();
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; } };
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; } });
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(); } }
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 按下滑动,手指抬起后触发
@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); }
@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); }
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); } }
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; } };