Convert pixels to sp

前端 未结 3 1294
野趣味
野趣味 2020-11-27 15:18

I need the current TextSize of the TextView in sp units.

But getTextSize() returns the size in pixels

相关标签:
3条回答
  • 2020-11-27 15:40

    Use this

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

    If you wanna test if this method works right use this snippet

    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()));
    

    Both TextView's font size should be same.

    0 讨论(0)
  • 2020-11-27 15:50

    weird to see public field that is adjusted at run time but it works. Standard Dpi is 160 so whatever your device Dpi is, say 240, both density and scaledDensity will show 240/160=1.5 This is how you convert between pixels and sp: px=1.5*sp

    0 讨论(0)
  • 2020-11-27 16:03

    See the DisplayMetrics class, it has fields for densityDpi and scaledDensity.

    Example usage:

    float sp = px / getResources().getDisplayMetrics().scaledDensity;
    
    0 讨论(0)
提交回复
热议问题