| 知乎专栏 |
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;
}
};