android 多屏异屏显
android 多屏异屏显
工作组要对车机做成套软件。三个屏幕,仪表,中控和副驾驶屏幕。软件跨屏幕调用有音乐,视频,副屏幕底部悬浮窗控制栏。视频用到了三指飞屏。现在主要分享一下用到的代码和使用范围。
视频三指飞屏
1.自定义viewgroup监听viewGroup的touchevent。
下面展示一些 `内联代码片`。
// 拦截判断触控点数
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
pointerCount = Math.max(ev.getPointerCount(), pointerCount);
if (pointerCount >= POINT_COUNT){
actionDownX = ev.getX();
return true;
}else {
return false;
}
}
2拦截之后监听滑动操作
// 判断滑动距离和方向
@Override
public boolean onTouchEvent(MotionEvent event) {
pointerCount = event.getPointerCount();
if (pointerCount >= POINT_COUNT){
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
Objects.requireNonNull(callback).onPressAction(true);
break;
case MotionEvent.ACTION_POINTER_UP:
if (event.getPointerCount() == POINT_COUNT) {
actionUpX = event.getX();
Log.e(TAG, "onTouchEvent: action up-----------" + actionUpX);
adjusScrollDirection();
}
break;
}
// gestureDetector.onTouchEvent(event);
return false;
}else {
return false;
}
}
activity 切换副屏幕。
// 跳转副屏幕
public void newSecondActivity(int windowIndex) {
saveVideoProgress();
CurrentActivity = 1;
finish();
isChangeScreen = true;
Intent in = new Intent(this, SecondActivity.class);
ActivityOptions options = ActivityOptions.makeBasic();
in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
options.setLaunchDisplayId(displays[windowIndex].getDisplayId());
startActivity(in, options.toBundle());
}
一个activity在另一个屏幕打开activity,需要传入options的launchdisplayid。同时要设置intent的flag为Intent.FLAG_ACTIVITY_NEW_TASK
service中打开异屏悬浮窗
1.service打开悬浮窗这个就很有意思了。不像activity,有ActivityOptions。直接贴代码
// 创建布局
public void toSecondScreen() {
DisplayManager mDisplayManager = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
;//屏幕管理类
Display[] displays = mDisplayManager.getDisplays(); //得到显示器数组;//屏幕数组
Display secondDisplay = displays[1];
Context secondDisplayContext = createDisplayContext(secondDisplay);
mWindowManager = (WindowManager) secondDisplayContext.getSystemService(WINDOW_SERVICE);
mLayoutParams = new WindowManager.LayoutParams();
mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// mLayoutParams.type = WindowManager.LayoutParams.TYPE_TOAST;
mLayoutParams.format = PixelFormat.RGBA_8888;
mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;
mLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mLayoutParams.x = 0;
mLayoutParams.y = 0;
cuslayout = new CustomContentLinearlayout(secondDisplayContext);
showLayout();
}
private void showLayout() {
if (isShow) {
Toast.makeText(this, "已经显示", Toast.LENGTH_SHORT).show();
}
if (cuslayout != null) {
mWindowManager.addView(cuslayout, mLayoutParams);
isShow = true;
}
}
跟activity不同的是要 Context secondDisplayContext = createDisplayContext(secondDisplay);
创建一个displaycontex。然后才能设置屏幕id
遗留问题
1.0屏幕打开a后再关闭,1屏幕再打开a,仍然会出现在0屏幕,问题是出现在底层。video当时用的是a,b两个activity,实现双入口实现的,但只能治标不治本。