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,实现双入口实现的,但只能治标不治本。

猜你喜欢

转载自blog.csdn.net/qq_25834197/article/details/115349232