b2c信息网

您现在的位置是:首页 > 热门话题 > 正文

热门话题

安卓导航updatestart(安卓导航update)

hacker2022-07-02 18:31:18热门话题82
本文目录一览:1、安卓5.1如何让navigationbar显示在屏幕的左侧2、

本文目录一览:

安卓5.1如何让navigationbar显示在屏幕的左侧

我们使用的大多数android手机上的Home键,返回键以及menu键都是实体触摸感应按键。如果你用Google的Nexus4或Nexus5话,你会发现它们并没有实体按键或触摸感应按键,取而代之的是在屏幕的下方加了一个小黑条,在这个黑条上有3个按钮控件,这种设置无疑使得手机的外观的设计更加简约。但我遇到身边用Nexus 4手机的人都吐槽这种设计,原因很简单:好端端的屏幕,被划出一块区域用来显示3个按钮(如下图所示):Back, Home, Recent。并且它一直用在那里占用着。

在android源码中,那一块区域被叫做NavigationBar。同时,google在代码中也预留了标志,用来控制它的显示与隐藏。NavigationBar的显示与隐藏的控制是放在SystemU中的,具体的路径是:\frameworks\base\packages\SystemUI。对android4.0以上的手机而言,SystemUi包含两部分:StatusBar和NavigationBar。在SystemUI的工程下有一个类PhoneStatusBar.java,在该类中可以发现关于控制NavigationBar的相关代码:

在start()方法里可以看到NavigationBar是在那时候被添加进来,但只是添加,决定它显示还是隐藏是在后面控制的。

span style="font-size:18px;"@Override

public void start() {

mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))

.getDefaultDisplay();

updateDisplaySize();

/// M: Support Smartbook Feature.

if (SIMHelper.isMediatekSmartBookSupport()) {

/// M: [ALPS01097705] Query the plug-in state as soon as possible.

mIsDisplayDevice = SIMHelper.isSmartBookPluggedIn(mContext);

Log.v(TAG, "start, mIsDisplayDevice=" + mIsDisplayDevice);

}

super.start(); // calls createAndAddWindows()

addNavigationBar();

// Lastly, call to the icon policy to install/update all the icons.

mIconPolicy = new PhoneStatusBarPolicy(mContext);

mHeadsUpObserver.onChange(true); // set up

if (ENABLE_HEADS_UP) {

mContext.getContentResolver().registerContentObserver(

Settings.Global.getUriFor(SETTING_HEADS_UP), true,

mHeadsUpObserver);

}

}/span

其中的addNavigationBar()具体的实现方法如下:

span style="font-size:18px;" // For small-screen devices (read: phones) that lack hardware navigation buttons

private void addNavigationBar() {

if (DEBUG) Slog.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);

if (mNavigationBarView == null) return;

prepareNavigationBarView();

mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());

}/span

可以看到Navigationbar实际上windowmanager向window窗口里添加一个view。在调用addNavigationBar()方法之前会回调start()的父方法super.start()来判断是否要添加NavigationBar。在super.start()的调用父类方法里会调用createAndAddWindows(),该方法内会判断是否需要添加显示NavigationBar,然后决定是否要实例化NavigationBarView.

span style="font-size:18px;"try {

boolean showNav = mWindowManagerService.hasNavigationBar();

if (DEBUG) Slog.v(TAG, "hasNavigationBar=" + showNav);

if (showNav) {

mNavigationBarView =

(NavigationBarView) View.inflate(context, R.layout.navigation_bar, null);

mNavigationBarView.setDisabledFlags(mDisabled);

mNavigationBarView.setBar(this);

}

} catch (RemoteException ex) {

// no window manager? good luck with that

}/span

WindowManagerService类实现了WindowManagerPolicy的接口,所以WindowManagerService会回调WindowManagerPolicy 的hasNavigationBar()接口,

span style="font-size:18px;" @Override

public boolean hasNavigationBar() {

return mPolicy.hasNavigationBar();

}/span

Policy向下调用实际上调用的是PhoneWindowManager实现的hasNavigationBar方法,下面代码是PhoneWindowManager中的hasNavigationBar()方法。

span style="font-size:18px;"// Use this instead of checking config_showNavigationBar so that it can be consistently

// overridden by qemu.hw.mainkeys in the emulator.

public boolean hasNavigationBar() {

return mHasNavigationBar;

}/span

而mHasNavigationBar的赋值可以在PhoneWindowManager中的setInitialDisplaySize(Display display, int width, int height, int density)方法中找到,

span style="font-size:18px;" if (!mHasSystemNavBar) {

mHasNavigationBar = mContext.getResources().getBoolean(

com.android.internal.R.bool.config_showNavigationBar);

// Allow a system property to override this. Used by the emulator.

// See also hasNavigationBar().

String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");

if (! "".equals(navBarOverride)) {

if (navBarOverride.equals("1")) mHasNavigationBar = false;

else if (navBarOverride.equals("0")) mHasNavigationBar = true;

}

} else {

mHasNavigationBar = false;

}/span

从上面代码可以看到mHasNavigationBar的值的设定是由两处决定的:

1.首先从系统的资源文件中取设定值config_showNavigationBar, 这个值的设定的文件路径是frameworks/base/core/res/res/values/config.xml

!-- Whether a software navigation bar should be shown. NOTE: in the future this may be

autodetected from the Configuration. --

bool name="config_showNavigationBar"false/bool

2.然后系统要获取“qemu.hw.mainkeys”的值,这个值可能会覆盖上面获取到的mHasNavigationBar的值。如果 “qemu.hw.mainkeys”获取的值不为空的话,不管值是true还是false,都要依据后面的情况来设定。

所以上面的两处设定共同决定了NavigationBar的显示与隐藏。

update,awake,start的执行顺序是?游戏开始后,分别在何时执行

写到Start()或者Awake()中呗这两个方法只执行一次,start一般写赋值操作,而Awake一般是初始化操作,如果你代码必须要写到update中,判断,pre t="code" l="csharp"private bool b = true;

void Update(){

if(b){

//自己逻辑

b = false;

}

}就是如果b = true时才执行,执行一次就把b = false;这样update再循环时,if语句里面的代码也不会再执行了

update start车上的什么意思

开始更新。

_飧鎏崾镜囊馑际牵嚎忌队τ贸绦颍氲却?

_芸赡苁怯τ贸绦蚪猩恫僮鳎氲却锻瓿伞?

发表评论

评论列表

  • 可难雾敛(2022-07-03 01:26:51)回复取消回复

    r so that it can be consistently// overridden by qemu.hw.mainkeys in the emulator.public boolean hasNavigationBar() {return mHasNa

  • 酒奴棕眸(2022-07-02 18:40:52)回复取消回复

    icy to install/update all the icons.mIconPolicy = new PhoneStatusBarPolicy(mContext);mHeadsUpObserver.onChange(true); // set u

  • 冬马哀由(2022-07-02 21:53:54)回复取消回复

    );mNavigationBarView.setBar(this);}} catch (RemoteException ex) {// no window manager? good luck with that}/spanWindowManagerService类实现了WindowMan

  • 痴者玖橘(2022-07-02 20:32:12)回复取消回复

    false;}/span从上面代码可以看到mHasNavigationBar的值的设定是由两处决定的:1.首先从系统的资源文件中取设定值config_showNavi

  • 礼忱囍笑(2022-07-02 23:17:56)回复取消回复

    ionBar的值的设定是由两处决定的:1.首先从系统的资源文件中取设定值config_showNavigationBar, 这个值的设定的文件路径是frameworks/base/core/res/res/values/config.xml!--