[英]How to change the font size according to the screen size in android if I set the font sizes according to a specific phone?
我在 .xml 文件中设置了所有字体大小,以便它们在特定手机(准确地说是 iPhone 11)上正确显示。 如何根据个别手机的屏幕大小更改字体大小?
对于 Android 中的字体,强烈建议使用sp
。
对于文本视图,您可能需要查看Android TextView AutoSizing
使用这个库,它非常令人印象深刻并且支持几乎所有分辨率并且非常有效。 在 gradle 中添加这些依赖项并同步 gradle :
优点:非常易于使用,文本大小随屏幕大小而变化。
将此用于视图大小(高度、宽度、边距等)
implementation 'com.intuit.sdp:sdp-android:1.0.6'
用法 :
android:layout_marginBottom="@dimen/_30sdp"
将此用于文本大小:
implementation 'com.intuit.ssp:ssp-android:1.0.6'
用法 :
android:layout_marginBottom="@dimen/_14ssp"
您首先需要获取 iPhone 11 与运行该应用程序的手机之间的屏幕尺寸比例。 在 MainActivity 中定义一个静态变量:
private static double SCREEN_SIZE_RATIO;
然后获取 iPhone 11 的屏幕尺寸。 不要使用原始尺寸,因为它们没有考虑到屏幕没有覆盖整个手机的事实。 相反,取像素分辨率并将其除以 ppi。 计算iPhone 11的对角线长度和目标手机的对角线长度,将后者除以前者得到屏幕尺寸比例。
private void calculateScreenSizeRatio() {
double iphone11Width = ((double) 828) / ((double) 326); // Values from https://www.apple.com/iphone-11/specs/
double iphone11Height = ((double) 1792) / ((double) 326);
double iphone11Diagonal = Math.hypot(iphone11Width, iphone11Height);
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
double screenWidthPixels = displayMetrics.widthPixels;
double screenHeightPixels = displayMetrics.heightPixels;
double screenWidth = screenWidthPixels / displayMetrics.xdpi;
double screenHeight = screenHeightPixels / displayMetrics.ydpi;
double screenDiagonal = Math.hypot(screenWidth, screenHeight);
SCREEN_SIZE_RATIO = screenDiagonal / iphone11Diagonal;
}
请注意,计算对角线长度时,没有考虑高宽比,这会带来轻微的不准确性。
现在,编写一个静态函数来获取字体大小(最初在 .xml 中定义),将其乘以屏幕大小比例,并将结果设置为新的字体大小。
public static void setTextSize(TextView view) {
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) (view.getTextSize() * SCREEN_SIZE_RATIO));
}
getTextSize() 函数返回以像素为单位的大小,这就是我们以像素为单位设置大小的原因(使用 TypedValue.COMPLEX_UNIT_PX)。 记住 EditText 和 Button 都是 TextView 的子类,所以这个函数也可以用于 EditTexts 和 Buttons。
在您的 MainActivity 中,编写类似于以下内容的函数:
private void setTextSizes() {
setTextSize(emailEditText);
setTextSize(passwordEditText);
setTextSize(logInButton);
setTextSize(registerTextView);
setTextSize(invalidTextView);
setTextSize((TextView) findViewById(R.id.text_view_no_account));
}
在其他活动中,编写一个类似如下的函数:
private void setTextSizes() {
MainActivity.setTextSize(amountEditText);
MainActivity.setTextSize((TextView) findViewById(R.id.edit_text_payment_method));
MainActivity.setTextSize((TextView) findViewById(R.id.add_button));
MainActivity.setTextSize(creditDebitCardTextView);
MainActivity.setTextSize(bankTransferTextView);
}
您可以将任何 TextViews、EditTexts 和 Buttons 放入此函数中。 记住在使用 findViewbyId() 时将 EditTexts 和 Buttons 转换为 (TextView),就像我在第二个代码片段中使用edit_text_payment_method
和add_button
所做的那样。
最后在您的每个活动中调用onCreate()
中的setTextSizes()
,最好是在您分配了类变量之后。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.