我正在编写一个应用程序,以在Android中显示一个简单的数字时钟,我需要缩放TextView的字体大小,以使其尽可能填满整个屏幕。我找到了一种使用displayMetrics缩放文本大小的非常简单的方法,但是在某些设备上无法正常工作。 我要实现的目标如下所示:
我只能在横向模式下工作,并且我希望它可以在周围的旧智能手机和平板电脑以及较新的设备上运行。因此,我可以选择多种屏幕类型。
要缩放字体,请执行以下操作
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_clock);
// Get screen size and calculate text size needed to fit
// TODO: doesn't work well on some devices
TextView tvScreenSize = findViewById(R.id.tvScreenSize);
DisplayMetrics displayMetrics = new DisplayMetrics(); // From: https://stackoverflow.com/questions/4743116/get-screen-width-and-height
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
// The screen height and width are recalculated automatically by Android when the screen is redrawn on a rotation
height = displayMetrics.heightPixels;
width = displayMetrics.widthPixels;
textSP = width / 12; // Empirical value
String hString = Integer.toString(height);
String wString = Integer.toString(width);
tvScreenSize.setText("h: " + hString + " w:" + wString);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Display time of day
Date curDate = new Date();
TextView tvTime = findViewById(R.id.clockView);
String timeStr = format.format(curDate);
tvTime.setText(timeStr);
tvTime.setScaleY(1.5f);
tvTime.setWidth(width * 8 / 10); // Make it fill 80% of the screen
tvTime.setHeight(height * 8 / 10);
tvTime.setTextSize(textSP);
...
行与行:
textSP = width / 12; // Empirical value
对于某些屏幕,值为6效果很好。对于其他屏幕,这会创建一个太大的字体,以至于只有一小部分可见。将此值更改为12可以解决问题。
似乎我缺少与屏幕密度有关的东西,但是什么呢?
谢谢!
最终结果:对于任何想要像我这样缩放文本的人,这是从ismail输入后的最终代码:
activity_main.xml文件:
?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvClockFace"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
android:text="12:34"
android:textColor="@android:color/holo_red_dark"
android:textSize="30sp"
android:textStyle="bold"
android:typeface="monospace"
app:fontFamily="monospace"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tvScreenSize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:text="H:... W:..."
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</android.support.constraint.ConstraintLayout>
和MainActivity.java:
package com.schalkx.testautosizeclockdisplay;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.Display;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Scale the textsize automatically
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);
float density = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth = outMetrics.widthPixels / density;
// Convert height and width to integer values
float fTextSize = dpWidth/4; // Trial and error
// int iTextSize = Math.round(fTextSize);
int scrHeight = Math.round(dpHeight);
int scrWidth = Math.round(dpWidth);
// Display de height and width on screen (for reference)
String wString = Integer.toString(scrWidth); // In case you need the width
String hString = Integer.toString(scrHeight); // Same for height
TextView tvScreenSize = findViewById(R.id.tvScreenSize);
tvScreenSize.setText("h: " + hString + " w:" + wString);
// Scale the font of the clock face
TextView tvClockFace = findViewById(R.id.tvClockFace);
// tvClockFace.setHeight(50);
// tvClockFace.setWidth(100);
tvClockFace.setTextSize(fTextSize);
tvClockFace.setScaleY(1.5f);
}
}
答案 0 :(得分:1)
根本不使用代码中的像素值。将像素转换为与设备无关的像素(dp)
Button.Content = "Init Value"
答案 1 :(得分:1)
要获得更好的显示体验,您应该使用dp
而不是px
,这里是如何获得dp
大小的方法:
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);
float density = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth = outMetrics.widthPixels / density;
所以现在您可以在屏幕dpHeight
和dpWidht
上相应地设置文本大小
答案 2 :(得分:0)
您可以使用textview的auto size选项来代替displayMetrics。
将此添加到textview xml:
app:autoSizeTextType="uniform"