繁体   English   中英

如果我根据特定手机设置字体大小,如何根据android中的屏幕大小更改字体大小?

[英]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_methodadd_button所做的那样。

最后在您的每个活动中调用onCreate()中的setTextSizes() ,最好是在您分配了类变量之后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM