android自定义控制中心仿vivo


此功能是系列文章(主要是一下子写完太多了,有点费时间),本篇幅只写第一步剩下的以后有时间补上。

(一)寻找全局可执行到的“点”

首先明确需求:1,可以从屏幕下方向上滑动唤起(类似vivo)。2,可以全局操作,在任何界面都能唤起。3,有控制中心相应的功能。
本片主要讲述1和2。

1.可以全局操作。

首先我们的操作中心必须和原生的一样可以全局被唤醒,那么我们就来达成这个需求。
我们知道android的界面是在window中显示的,那么就从PhoneWindowManager.java这个window的管理类中看看有什么发现。
位置:frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

/**
 * The policy that provides the basic behaviors and states of a display to show UI.
 */
public class DisplayPolicy extends AbsDisplayPolicy {

	/**
	*省略
	*/
	
    /** {@inheritDoc} */
    @Override
    public void init(Context context, IWindowManager windowManager,
            WindowManagerFuncs windowManagerFuncs) {
            /**
            *省略
            */
        // monitor for system gestures
        // TODO(multi-display): Needs to be display specific.
        mSystemGestures = new SystemGesturesPointerEventListener(context,
                new SystemGesturesPointerEventListener.Callbacks() {
                    @Override
                    public void onSwipeFromTop() {
                    	android.util.Log.d("MyLog","-----------onSwipeFromTop()-----------");
                        if (mStatusBar != null) {
                            requestTransientBars(mStatusBar);
                        }
                    }
                    @Override
                    public void onSwipeFromBottom() {
                    	android.util.Log.d("MyLog","-----------onSwipeFromBottom()-----------");
                        if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_BOTTOM) {
                            requestTransientBars(mNavigationBar);
                            if (mDynamicNavigationBar) {
                                showNavigationBar(true, true); // SPRD: add for dynamic navigationbar
                            }
                        }
                    }
                    @Override
                    public void onSwipeFromRight() {
                        if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_RIGHT) {
                            requestTransientBars(mNavigationBar);
                            if (mDynamicNavigationBar) {
                                showNavigationBar(true, true); // SPRD: add for dynamic navigationbar
                            }
                        }
                    }
                    @Override
                    public void onSwipeFromLeft() {
                        if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_LEFT) {
                            requestTransientBars(mNavigationBar);
                            if (mDynamicNavigationBar) {
                                showNavigationBar(true, true); // SPRD: add for dynamic navigationbar
                            }
                        }
                    }
                    @Override
                    public void onThreePointerSwipe() {
                        if (mStatusBar != null) {
                            android.util.Log.i("lq", "onThreePointerSwipe TAKE_SCREENSHOT_FULLSCREEN");
                            mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN);
                            mHandler.post(mScreenshotRunnable);
                        }
                    }
                    @Override
                    public void onFling(int duration) {
                        if (mPowerManagerInternal != null) {
                            // Sprd: Modify scene id
                            mPowerManagerInternal.powerHint(
                                    PowerHintVendorSprd.POWER_HINT_VENDOR_INTERACTION_FLING, 2*duration);
                        }
                        scheduleBoostWhenTouch();
                    }
                    @Override
                    public void onDebug() {
                        // no-op
                    }
                    @Override
                    public void onDown() {
                        scheduleBoostWhenTouch();
                        mOrientationListener.onTouchStart();
                    }
                    @Override
                    public void onUpOrCancel() {
                        scheduleBoostWhenTouch();
                        mOrientationListener.onTouchEnd();
                    }
                    @Override
                    public void onMouseHoverAtTop() {
                        mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS);
                        Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS);
                        msg.arg1 = MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS;
                        mHandler.sendMessageDelayed(msg, 500);
                    }
                    @Override
                    public void onMouseHoverAtBottom() {
                        mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS);
                        Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS);
                        msg.arg1 = MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION;
                        mHandler.sendMessageDelayed(msg, 500);
                    }
                    @Override
                    public void onMouseLeaveFromEdge() {
                        mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS);
                    }
                });
                /**
                *省略
                */
    }
    //省略
}

可以发现在PhoneWindowManager.java中,根据名字发现onSwipeFromTop()和onSwipeFromBottom()很有可能就是顶端滑动和底部滑动所触发的事件,然后可以加上log验一下。

经过个人验证(log截图省略),这两个方法确实可以达到需求。

2.全局可用

在第一步里面PhoneWindowManager.java中的onSwipeFromTop()和onSwipeFromBottom()就可以做到全局可用。
经个人验证,确实可以全局触发(log截图省略)。

提示

以上内容基于android9,经个人研究发现在android10中onSwipeFromTop()和onSwipeFromBottom()并非在PhoneWindowManager.java中而是在DisplayPolicy.java文件中。
位置:frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值