0

我在我的值中添加了普通屏幕的每个屏幕尺寸的字体大小:<dimen name="fontsize">22sp</dimen> 对于小屏幕:<dimen name="fontsize">19sp</dimen> ...

但是当我有两种正常的屏幕尺寸时,一个是 xhdpi,另一个是 hdpi,我必须添加另一个值文件夹:对于 normal-xhdpi 屏幕:<dimen name="fontsize">22sp</dimen> 对于 normal-hdpi 屏幕:<dimen name="fontsize">15sp</dimen>

但我知道 sp 单位会因屏幕 dpi 的不同而有所不同,为什么会出现此错误以及如何在所有屏幕上拥有所需的字体大小?

我想知道的是:

sp 与比例无关的像素 - 这类似于 dp 单位,但它也根据用户的字体大小偏好进行缩放。建议您在指定字体大小时使用此单位,以便根据屏幕密度和用户偏好进行调整。

那么为什么这不起作用呢?我为每个屏幕尺寸 small、normal、large 和 xlarge 放置了一个 valuse 文件夹,我认为 sp 将根据 dpi 进行更改,因此无需添加 dpi .. 但这行不通吗?

4

1 回答 1

1

使用这个实用程序类:

com.cutompackage;
    import android.content.Context;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.util.TypedValue;
    import android.widget.TextView;
    /**
     * Utillity class which is changing font size of text view in app in order to fit to given dimensions
     * @author Darko
     *
     */
    public class FontFitTextView extends TextView {

        public FontFitTextView(Context context) {
            super(context);
            initialise();
        }

        public FontFitTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initialise();
        }

        private void initialise() {
            mTestPaint = new Paint();
            mTestPaint.set(this.getPaint());
            // max size defaults to the initially specified text size unless it is
            // too small
        }

        /*
         * Re size the font so the specified text fits in the text box assuming the
         * text box is the specified width.
         */
        private void refitText(String text, int textWidth) {
            if (textWidth <= 0)
                return;
            int targetWidth = textWidth - this.getPaddingLeft()
                    - this.getPaddingRight();
            float hi = 100;
            float lo = 2;
            final float threshold = 0.5f; // How close we have to be

            mTestPaint.set(this.getPaint());

            while ((hi - lo) > threshold) {
                float size = (hi + lo) / 2;
                mTestPaint.setTextSize(size);
                if (mTestPaint.measureText(text) >= targetWidth)
                    hi = size; // too big
                else
                    lo = size; // too small
            }
            // Use lo so that we undershoot rather than overshoot
            if (this.getTextSize() > lo) {
                this.setTextSize(TypedValue.COMPLEX_UNIT_PX, lo);
            }
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
            int height = getMeasuredHeight();
            refitText(this.getText().toString(), parentWidth);
            this.setMeasuredDimension(parentWidth, height);
        }

        @Override
        protected void onTextChanged(final CharSequence text, final int start,
                final int before, final int after) {
            refitText(text.toString(), this.getWidth());
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            if (w != oldw) {
                refitText(this.getText().toString(), w);
            }
        }

        // Attributes
        private Paint mTestPaint;
    }

然后只需在 xml 中设置,如:

 <com.cutompackage.FontFitTextView
                android:id="@+id/headerText"
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:textColor="@color/text_color"
                android:textSize="22sp" />

编辑:它会自动更改字体大小以适应给定的尺寸(高度和宽度),TextView现在您只需要正确设置尺寸即可。

希望能帮助到你

于 2014-01-18T12:08:46.417 回答