android原始碼分析之大字型
大字型
在Settings—Accessibility有一個大字型(Large text)的功能,點選大字型的按鈕,系統所有的字型放大。
這個功能是怎麼實現的呢?
開啟原始檔:
./packages/apps/Settings/src/com/android/settings/accessibility/AccessibilitySettings.java
我們可以看到處理點選事件的程式碼:
private void handleToggleLargeTextPreferenceClick() {
try {
mCurConfig.fontScale = mToggleLargeTextPreference.isChecked() ? LARGE_FONT_SCALE : 1;
ActivityManagerNative.getDefault().updatePersistentConfiguration(mCurConfig);
} catch (RemoteException re) {
/* ignore */
}
}
從程式碼可以看出,其實只是呼叫了updatePersistentConfiguration來理新了系統的配置類mCurConfig,就實現了此功能。
我們再來看相關的關鍵程式碼:
字型放大功能是把字型放大到1.3倍
private static final float LARGE_FONT_SCALE = 1.3f;
再來看配置類Configuration:
import android.content.res.Configuration;
private final Configuration mCurConfig = new Configuration();
在更新介面的方法updateServicesPreferences()中:
// Large text.
try { mCurConfig.updateFrom(ActivityManagerNative.getDefault().getConfiguration());
} catch (RemoteException re) {
/* ignore */
}
mToggleLargeTextPreference.setChecked(mCurConfig.fontScale == LARGE_FONT_SCALE);
關鍵類Configuration:
This class describes all device configuration information that can impact the resources the application retrieves. This includes both user-specified configuration options (locale and scaling) as well as device configurations (such as input modes, screen size and screen orientation).
You can acquire this object from Resources, using getConfiguration(). Thus, from an activity, you can get it by chaining the request with getResources():
Configuration config = getResources().getConfiguration();
我們開啟原始碼:
./frameworks/base/core/java/android/content/res/Configuration.java
可以看到與字型相關的原始碼:
public float fontScale;
............
public static final int SCREENLAYOUT_SIZE_MASK = 0x0f;
public static final int SCREENLAYOUT_SIZE_UNDEFINED = 0x00;
public static final int SCREENLAYOUT_SIZE_SMALL = 0x01;
public static final int SCREENLAYOUT_SIZE_NORMAL = 0x02;
public static final int SCREENLAYOUT_SIZE_LARGE = 0x03;
public static final int SCREENLAYOUT_SIZE_XLARGE = 0x04;
在./frameworks/base/docs/html/guide/topics/resources/providing-resources.jd檔案中,我們也只能看到:
<tr id="ScreenSizeQualifier">
<td>Screen size</td>
<td>
<code>small</code><br/>
<code>normal</code><br/>
<code>large</code><br/>
<code>xlarge</code>
</td>
<td>
字型大小
在Settings—Display—Font size有小,正常,大,超大四個字型。
我們可以看到這幾種字型的縮放比例:
./packages/apps/Settings/res/values/arrays.xml
<string-array name="entryvalues_font_size" translatable="false">
<item>0.85</item>
<item>1.0</item>
<item>1.15</item>
<item>1.30</item>
</string-array>
開啟程式碼:
packages/apps/Settings/src/com/android/settings/DisplaySettings.java
我們可以檢視與字型相關的程式碼:
import android.content.res.Configuration;
private final Configuration mCurConfig = new Configuration();
public void readFontSizePreference(ListPreference pref) {
try { mCurConfig.updateFrom(ActivityManagerNative.getDefault().getConfiguration());
} catch (RemoteException e) {
Log.w(TAG, "Unable to retrieve font size");
}
…….
}
public void writeFontSizePreference(Object objValue) {
try {
mCurConfig.fontScale = Float.parseFloat(objValue.toString()); ActivityManagerNative.getDefault().updatePersistentConfiguration(mCurConfig);
} catch (RemoteException e) {
Log.w(TAG, "Unable to save font size");
}
}
相關文章
- Android 原始碼分析之 AsyncTask 原始碼分析Android原始碼
- 【Android原始碼】Fragment 原始碼分析Android原始碼Fragment
- 【Android原始碼】Intent 原始碼分析Android原始碼Intent
- 【Android原始碼】AlertDialog 原始碼分析Android原始碼
- Android Choreographer 原始碼分析Android原始碼
- Android RecycleView原始碼分析AndroidView原始碼
- Android——Handler原始碼分析Android原始碼
- 【Android原始碼】Handler 機制原始碼分析Android原始碼
- Android 原始碼分析之 EventBus 的原始碼解析Android原始碼
- Android原始碼分析--CircleImageView 原始碼詳解Android原始碼View
- Android中IntentService原始碼分析AndroidIntent原始碼
- Android開源原始碼分析Android原始碼
- 【Android原始碼】LayoutInflater 分析Android原始碼
- Android JiaoZiVideoPlayer原始碼分析AndroidIDE原始碼
- Android的AsyncTask原始碼分析Android原始碼
- Android SharedPreferences 原始碼分析Android原始碼
- android view layout原始碼分析AndroidView原始碼
- Android 原始碼結構分析Android原始碼
- Android Volley原始碼分析Android原始碼
- Android 原始碼分析之旅3 1 訊息機制原始碼分析Android原始碼
- Android 8.0 原始碼分析 (八) ActivityManagerServiceAndroid原始碼
- Android原始碼分析–ArrayMap優化Android原始碼優化
- Android原始碼分析相關工具Android原始碼
- Android系統原始碼分析-JNIAndroid原始碼
- Android Loader原始碼分析(二)Android原始碼
- Android開發Handler原始碼分析Android原始碼
- android IO Prefetch原始碼分析Android原始碼
- Android 系統原始碼-1:Android 系統啟動流程原始碼分析Android原始碼
- React Native 0.55.4 Android 原始碼分析(Java層原始碼解析)React NativeAndroid原始碼Java
- Android Jetpack系列——ViewModel原始碼分析AndroidJetpackView原始碼
- Android 原始碼分析(二)handler 機制Android原始碼
- Android系統原始碼分析-事件收集Android原始碼事件
- Android Activity啟動流程原始碼分析Android原始碼
- Android Sensor原始碼分析總結Android原始碼
- Android 7 原始碼分析系列導讀Android原始碼
- Android View 事件分發原始碼分析AndroidView事件原始碼
- Android原始碼分析:Activity啟動流程Android原始碼
- Android Handler機制使用,原始碼分析Android原始碼