将像素转换为sp

问题描述:

我需要当前TextSizeTextViewsp单位。将像素转换为sp

但是getTextSize()返回pixels的大小。那么有没有办法去convert pixels to sp

+0

另请参阅[this answer] (http://stackoverflow.com/a/42108115/3681880)为'DP - > PX','PX - > DP','SP到PX'和'PX到SP'转换。 – Suragch 2017-02-08 08:37:32

请参阅DisplayMetrics类,它的字段为densityDpiscaledDensity

用法示例:

float sp = px/getResources().getDisplayMetrics().scaledDensity; 
+1

只是为了澄清:'DisplayMetrics'类具有_fields_' densityDpi'和'scaledDensity',而不是方法。而对于缩放,人们会想要使用'density'字段而不是'densityDpi'。 – 2016-04-12 16:58:24

+0

请回答提问的问题。说一个可以用于答案的类的名字本身并不是一个答案。 – Megakoresh 2016-12-16 12:50:30

使用此

public static float pixelsToSp(Context context, float px) { 
    float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; 
    return px/scaledDensity; 
} 

如果你想测试,如果这种方法可行权使用这个片段

XML

<TextView 
     android:id="@+id/txtHelloWorld" 
     android:text="@string/hello_world" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="20sp"/> 

<TextView 
     android:id="@+id/txtHelloWorld2" 
     android:text="@string/hello_world" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 

的Java

View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
TextView helloWorldTextView = (TextView) rootView.findViewById(R.id.txtHelloWorld); 
TextView helloWorldTextView2 = (TextView) rootView.findViewById(R.id.txtHelloWorld2); 
helloWorldTextView2.setTextSize(pixelsToSp(getActivity(), helloWorldTextView.getTextSize())); 

两个TextView的字体大小都应该相同。

奇怪的是看到在运行时调整的公共字段,但它的工作原理。标准Dpi是160,所以无论你的设备Dpi是240,密度和比例密度都会显示240/160 = 1.5 这就是你如何在像素和sp之间进行转换:px = 1.5 * sp