如何完全自定义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的显示与隐藏。
一道Matlab仿真题,如图,这个要怎么做啊是直接绘图之类的
题主给出的一道磁化曲线Matlab仿真题,可以按下列方法来做:
1、分别将已知数据赋值给B和H。即
B=[0.1,0.2 。。。。。。,1.6]
H=[5,10 。。。。。。,10000]
2、使用plot函数,绘制基本磁化曲线图。即
plot(B,H)
xlabel(’B/(T)’);ylabel(’H(A/m)’)
3、预测值,可以用样条插值方法求解。即
xi=1.61;
pp=csape(B,H,’periodic’); 这里的采用周期性边界条件
yi=ppval(pp,xi);
4、运行结果
dominance和domination的区别是什么
问这对近义词的人必是学习认真的同学,一般人都没想到这样问,一是可能只认识其中之一甚至二者都不认识,二是两者模模糊糊认识,没有把它们联系起来细想,还有一种可能是细想之后还是不得要领,查英汉词典和英英词典发现解释还是非常相近甚至一样,就连著名的牛津英语词典解释:dominance // n. 1 the state of being dominant.2 control, authority.
domination // n. 1 command, control. 2 the act or an instance of dominating; the process of being dominated. 这解释也可能让人看后依然云里雾里,海外native E speakers也有讨论来讨论去仍说不清道不明的。由此可见,这2词的确太近义不易区分,因此有的人就认为根本不必区分。若像楼主一样非要弄清分别,那就只好再多查几部词典,多看权威英语文献的实际用例。再加以自己的细心比较体会,就会明白:因为二者都是dominate的名词形式,自然意义都是根据该动词意义派生而来,所以很相近,但又不完全相同,区别主要在于各有侧重,dominance侧重抽象意义的影响力dominating influence,而domination则侧重指实际的支配统治地位dominating power or actual control
-navigationbar