Android源碼問題解答之三(狀態列和鎖屏),android鎖屏
case1:如何調整狀態列中通知欄裡表徵圖的間隔
狀態列中通知欄的表徵圖大多不是方方正正的矩形或者正方形,但是一旦兩個或者兩個以上的方正的表徵圖相鄰時,沒有間隙,會有視覺上的局促感。可以通過給表徵圖增加間隙的方法,來使其更加美觀。修改如下:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
for (int i=0; i<toShow.size(); i++) { View v = toShow.get(i); if (v.getParent() == null) {+ v.setPadding(2, 0, 2, 0); mNotificationIcons.addView(v, i, params); } }
setPadding(int left,int top,int right,int bottom)的四個參數值可以根據實際情況進行賦值。
case2:如何修改鎖屏提示音的預設值
在frameworks/base/packages/SettingsProvider/res/values/defaults.xml檔案中,修改以下值就可以預設開啟或關閉鎖屏的提示音:
<integer name="def_lockscreen_sounds_enabled">1</integer>
1為開啟,0為關閉
case3:如何調整狀態列收縮展開速度?
調整狀態列收縮展開速度:
請在\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\PanelView.java
添加:
public static final float FLING_MIN_VELOCITY = 2000;//設定fling最小速度
在函數animationTick中增加以下粗體代碼:
private void animationTick(long dtms) {
if (!mTimeAnimator.isStarted()) {
......
if (mRubberbanding) {
mClosing = true;
} else if (mVel == 0) {
// if the panel is less than halfway open, close it
mClosing = (mFinalTouchY / getFullHeight()) < 0.5f;
} else {
mClosing = mExpandedHeight > 0 && mVel < 0;
}
//add
if(mVel > 0 && mVel <FLING_MIN_VELOCITY){
mVel = FLING_MIN_VELOCITY;
}else if(mVel < 0 && mVel > -FLING_MIN_VELOCITY){
mVel = -FLING_MIN_VELOCITY;
}
} else if (dtms > 0) {
......
}
其中:FLING_MIN_VELOCITY這個值代表最小的速度,可以根據實際情況及需求進行調整,值越大,速度越快。
case4:如何讓一個activity 浮在鎖定畫面的上方,按返回後再進入解鎖介面
可以給當前activity加上FLAG_SHOW_WHEN_LOCKED的屬性,如下:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
加上這個屬性後,該activity就可以 浮在鎖定畫面的上方,需要按返回後再進入解鎖介面。
case5:如何去掉開機動畫結束後的上鎖聲音?
預設情況下手機開機後的上鎖聲音是關閉的,並且即便開啟的話,由於在開機音樂的播放下,也是聽不到上鎖聲音的。但是如果去掉了開機音樂,開啟了初次上鎖聲音,就會聽到該聲音,影響使用者體驗,修改如下:將frameworks/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java中 // Whether the next call to playSounds() should be skipped. Defaults to // true because the first lock (on boot) should be silent. private boolean mSuppressNextLockSound = true;修改為:private boolean mSuppressNextLockSound = false;case6:如何在應用中預設全屏,隱藏狀態列和標題列
在應用程式中,如何預設全屏,隱藏狀態列和標題列。
修改如下:
在Activity的onCreate()方法中加入:
requestWindowFeature(Window.FEATURE_NO_TITLE);//設定介面無標題
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//設定全螢幕顯示
或者在AndroidManifest.xml中添加樣式
隱藏標題列需要使用預定義樣式:android:theme=”@android:style/Theme.NoTitleBar”.
隱藏狀態列:android:theme=”@android:style/Theme.NoTitleBar.Fullscreen”.
case7:如何屏蔽掉螢幕處於啟用狀態時點擊power鍵螢幕熄滅的功能?
修改power鍵訊息的傳遞,參見:
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {
......
case KeyEvent.KEYCODE_POWER: {
if (interceptPowerKeyUp(canceled || mPendingPowerKeyUpCanceled)) {
- result = (result & ~ACTION_WAKE_UP) | ACTION_GO_TO_SLEEP;
}
}
}
將上面那句注釋掉就可以了,不會影響到power鍵的關機等功能。
case8:如何在activity中禁止狀態列下拉?
禁止下拉欄下拉,可以參考如下方法,
在相關activity的onCreate,onResume,onStop介面中添加相應邏輯即可。具體如下:
import android.app.StatusBarManager;
import android.content.Context;
private StatusBarManager sStatusBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
if (sStatusBar == null) {
sStatusBar = (StatusBarManager)getSystemService(Context.STATUS_BAR_SERVICE);
}
}
@Override
public void onResume() {
super.onResume();
if (sStatusBar != null) {
sStatusBar.disable(StatusBarManager.DISABLE_EXPAND);
}
}
@Override
public void onStop() {
super.onStop();
if (sStatusBar != null) {
sStatusBar.disable(StatusBarManager.DISABLE_NONE);
}
}
case9:如何讓下拉欄情景模式切換按鈕增加切換到戶外模式的功能?
定位到frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\QuickSettingsModel.java中,按照如下紅色代碼修改即可:
第一步:設定可在各個情景模式之間切換,在addVolumeTile的onClick方法中添加下面紅色代碼:
if (AudioManager.RINGER_MODE_SILENT == ringerMode) {
...
} else if (AudioManager.RINGER_MODE_VIBRATE == ringerMode) {
Settings.System.putInt(mResolver,
Settings.System.SOUND_EFFECTS_ENABLED, 1);
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_OUTDOOR);
} else if (AudioManager.RINGER_MODE_OUTDOOR == ringerMode) {
Settings.System.putInt(mResolver,
Settings.System.SOUND_EFFECTS_ENABLED, 1);
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
} else {
...
}
第二步:設定切換到戶外模式時,需要顯示的圖片。由於平台版本預設無此功能,因此需要自行添加一張圖片到systemui的資源中。然後按照下面方式修改,在onVolumeStateChanged方法中添加下面紅色代碼:
if (AudioManager.RINGER_MODE_VIBRATE == ringerMode) {
mVolumeTileState.iconId = R.drawable.ic_qs_vibrate_on_sprd;
} else if (AudioManager.RINGER_MODE_SILENT == ringerMode) {
mVolumeTileState.iconId = R.drawable.ic_qs_silent_on_sprd;
} else if (AudioManager.RINGER_MODE_OUTDOOR == ringerMode) {
mVolumeTileState.iconId = R.drawable.ic_qs_gps_on_sprd; //這裡為新增的圖片
} else {
mVolumeTileState.iconId = R.drawable.ic_qs_general_on_sprd;
}
case10:如何修改鎖定畫面顯示的日期字型大小
在hvga版本中由於螢幕有限,在鎖定畫面有時需要改小顯示日期字型的大小,這樣才能在鎖定畫面中容納更多的東西。在其他版本中有時為了布局的美觀也會將字型改大或者改小。
需要修改檔案frameworks/base/packages/Keyguard/res/values/dimens.xml中widget_label_font_size對應的值。
例如:
修改前:
<dimen name="widget_label_font_size">16dp</dimen>
修改後:
<dimen name="widget_label_font_size">14dp</dimen>
原因:
鎖定畫面的顯示時間對應的view是檔案frameworks/base/packages/Keyguard/res/layout/keyguard_status_area.xml中的
<TextClock android:id="@+id/date_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/clock_white"
style="@style/widget_label"
android:gravity="center"
/>
而widget_label的定義在檔案frameworks/base/packages/Keyguard/res/values/styles.xml中為
<style name="widget_label">
<item name="android:textAllCaps">true</item>
<item name="android:textSize">@dimen/widget_label_font_size</item>
</style>
而widget_label_font_size的定義在檔案frameworks/base/packages/Keyguard/res/values/dimens.xml中。
case11:如何修改鎖定畫面顯示的時間字型大小
在hvga版本中由於螢幕有限,在鎖定畫面有時需要改小顯示時間字型的大小,這樣才能在鎖定畫面中容納更多的東西。在其他版本中有時為了布局的美觀也會將字型改大或者改小。
需要修改檔案frameworks/base/packages/Keyguard/res/values/dimens.xml中widget_big_font_size對應的值。
例如:
修改前:
<dimen name="widget_big_font_size">80dp</dimen>
修改後:
<dimen name="widget_big_font_size">48dp</dimen>
原因:
鎖定畫面的顯示時間對應的view是檔案frameworks/base/packages/Keyguard/res/layout/keyguard_status_view.xml中的
<TextClock
android:id="@+id/clock_view"
...
style="@style/widget_big_thin"
.../>
而widget_big_thin的定義在檔案frameworks/base/packages/Keyguard/res/values/styles.xml中為
<style name="widget_big_thin" parent="big_thin">
<item name="android:textSize">@dimen/widget_big_font_size</item>
</style>
而widget_big_font_size的定義在檔案frameworks/base/packages/Keyguard/res/values/dimens.xml中。
case12:如何修改鎖定畫面顯示的機主資訊和充電資訊字型大小
在hvga版本中由於螢幕有限,在鎖定畫面有時需要改小機主資訊和充電資訊字型大小,這樣才能在鎖定畫面中容納更多的東西。在其他版本中有時為了布局的美觀也會將字型改大或者改小。
需要修改檔案frameworks/base/packages/Keyguard/res/values/dimens.xml中kg_status_line_font_size對應的值。
例如:
修改前:
<dimen name="kg_status_line_font_size">20dp</dimen>
修改後:
<dimen name="kg_status_line_font_size">12dp</dimen>
case13:如何修改鎖定畫面密碼框字型的大小
有時為了布局的美觀會將鎖定畫面密碼框字型改大或者改小,
需要修改檔案frameworks/base/packages/Keyguard/res/layout/keyguard_password_view.xml檔案中
<EditText android:id="@+id/passwordEntry" />對應的android:textSize屬性的值
例如:
修改前:
<EditText android:id="@+id/passwordEntry"
...
android:textSize="26sp"
...
/>
修改後:
<EditText android:id="@+id/passwordEntry"
...
android:textSize="22sp"
...
/>
case14:如何讓鎖定畫面日期文字與設定模組設定的日期顯示格式字串完全相同?
需要修改兩個檔案即可:
1.定位到\frameworks\base\packages\Keyguard\src\com\android\keyguard\KeyguardStatusView.java的refresh函數:
修改前:
final String dateFormat = DateFormat.getBestDateTimePattern(locale,
res.getString(R.string.abbrev_wday_month_day_no_year));
修改後:
final String dateFormat = "KeyguardDateSameForSetting";
2.定位到\frameworks\base\core\java\android\widget\TextClock.java的onTimeChanged函數:
修改前:
setText(DateFormat.format(mFormat, mTime));
修改後:
if (mFormat.equals("KeyguardDateSameForSetting")) {
setText(DateFormat.getDateFormat(getContext()).format(mTime.getTime()));
} else {
setText(DateFormat.format(mFormat, mTime));
}
case15:設定模組中切換情景模式為戶外模式後,如何讓狀態列上顯示戶外模式表徵圖?
版本中是預設不支援狀態列顯示戶外模式表徵圖的,如果需要顯示,需要在systemui模組新增相關表徵圖和字串。
定位到frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBarPolicy.java的updateVolume方法中,增加如下紅色代碼即可
final boolean visible = ringerMode == AudioManager.RINGER_MODE_SILENT ||
ringerMode == AudioManager.RINGER_MODE_OUTDOOR ||
ringerMode == AudioManager.RINGER_MODE_VIBRATE;
if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) {
...
} else if (ringerMode == AudioManager.RINGER_MODE_OUTDOOR) {
iconId = R.drawable.stat_sys_outdoor; //新增圖片id
contentDescription = mContext.getString(R.string.stat_sys_outdoor); //新增字串id
} else {
...
}
case16:解鎖介面觸摸鎖表徵圖或滑動到某一功能上會有震動反饋,其強度如何調整
android\frameworks\base\packages\Keyguard\res\layout keyguard_glow_pad_view.xml
修改如下震動時間長度即可,0是不震動,數值越大震動感越強
- prvandroid:vibrationDuration="20"
+ prvandroid:vibrationDuration="40"