2011-06-07 76 views
44

我需要當前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

回答

25

請參閱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

131

使用此

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的字體大小都應該相同。

5

奇怪的是看到在運行時調整的公共字段,但它的工作原理。標準Dpi是160,所以無論你的設備Dpi是240,密度和比例密度都會顯示240/160 = 1.5 這就是你如何在像素和sp之間進行轉換:px = 1.5 * sp