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

时间:2020-09-16 14:17:52

标签: android

我在.xml文件中设置了所有字体大小,以便它们可以正确显示在特定的电话(准确地说是iPhone 11)上。如何根据单个电话的屏幕大小更改字体大小?

3 个答案:

答案 0 :(得分:1)

强烈建议在Android中使用sp使用字体。

对于文本视图,您可能想看看Android TextView AutoSizing

答案 1 :(得分:1)

使用此库,它给人留下深刻的印象,并支持几乎所有分辨率,并且非常有效。在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"

答案 2 :(得分:0)

首先,您需要获取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)。请记住,TextView的EditText和Button都是子类,因此此功能也可以用于EditTexts和Button。

在您的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);
}

您可以在此函数中放置任何TextView,EditText和Button。记得使用findViewbyId()时,将EditTexts和Buttons转换为(TextView),就像我在第二个代码片段中对edit_text_payment_methodadd_button所做的那样。

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