program tip

Android의 TextView에서 상단 및 하단 공간을 제거하는 방법

radiobox 2020. 11. 30. 08:01
반응형

Android의 TextView에서 상단 및 하단 공간을 제거하는 방법


레이아웃 파일에 아래 XML포함 시키면 아래 이미지를 볼 수 있습니다. 보시면 상단과 하단 공간이 있음을 알 수 있습니다.TextView

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="E1"
android:background="#ff00ff00"/>

여기에 이미지 설명 입력

공간을 제거하고 싶습니다. 그것을 제거하는 방법? 뭐라고 해요? 누군가 단서가 있으면 .. 알려주세요. 미리 감사드립니다.


보십시오 android:includeFontPadding="false"이 도움이 있는지. 내 경험상 약간 도움이 될 것이지만 TextView 크기를 정확한 픽셀 완벽한 텍스트 크기로 줄이는 방법은 없습니다.

더 나은 결과를 제공 할 수도 있고 제공하지 않을 수도있는 유일한 대안 은 높이 "24sp"대신 텍스트 크기와 일치하도록 치수를 고정하는 것입니다 "wrap_content".


나는 같은 문제가 있었다. 속성 android:includeFontPadding="false"이 작동하지 않습니다. 이 문제를 다음과 같이 해결했습니다.

public class TextViewWithoutPaddings extends TextView {

    private final Paint mPaint = new Paint();

    private final Rect mBounds = new Rect();

    public TextViewWithoutPaddings(Context context) {
        super(context);
    }

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

    public TextViewWithoutPaddings(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(@NonNull Canvas canvas) {
        final String text = calculateTextParams();

        final int left = mBounds.left;
        final int bottom = mBounds.bottom;
        mBounds.offset(-mBounds.left, -mBounds.top);
        mPaint.setAntiAlias(true);
        mPaint.setColor(getCurrentTextColor());
        canvas.drawText(text, -left, mBounds.bottom - bottom, mPaint);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        calculateTextParams();
        setMeasuredDimension(mBounds.width() + 1, -mBounds.top + 1);
    }

    private String calculateTextParams() {
        final String text = getText().toString();
        final int textLength = text.length();
        mPaint.setTextSize(getTextSize());
        mPaint.getTextBounds(text, 0, textLength, mBounds);
        if (textLength == 0) {
            mBounds.right = mBounds.left;
        }
        return text;
    }
}

android:includeFontPadding="false"꽤 좋지만 정확하게 얻지는 못합니다. 때로는 네거티브 여백을 적용하여 직접 알아낼 수 있도록 경계선 정확도를 원합니다.

아래쪽 및 위쪽 여백을 음수 값으로 설정하십시오.

이 같은:

android:layout_marginTop="-5dp"
android:layout_marginBottom="-5dp"

그에 따라 값을 조정하십시오.


나는 같은 문제에 직면했다. 여기에 좋은 대답이 있습니다. 텍스트를 TextView 상단에 정렬하는 방법은 무엇입니까?

그러나 코드는 거의 완성되지 않았으며 모든 글꼴 크기를 지원하지는 않습니다. 라인 변경

int additionalPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getContext().getResources().getDisplayMetrics());

...에

int additionalPadding = getTextSize() - getLineHeight();

완전한 C # 코드 (모노)는 상단 오프셋을 제거합니다.

public class TextControl : TextView {
    public TextControl (Context context) : base (context)
    {
        SetIncludeFontPadding (false);
        Gravity = GravityFlags.Top;
    }

    protected override void OnDraw (Android.Graphics.Canvas canvas)
    {
        if (base.Layout == null)
            return;

        Paint.Color = new Android.Graphics.Color (CurrentTextColor);
        Paint.DrawableState = GetDrawableState ();

        canvas.Save ();

        var offset = TextSize - LineHeight;
        canvas.Translate (0, offset);

        base.Layout.Draw (canvas);

        canvas.Restore ();
    }
}

이것이 우리 시대를 구한 코드입니다. maksimko의 모노 C # 코드를 사용하여 조정 되었습니다 .

public class TopAlignedTextView extends TextView {

    public TopAlignedTextView(Context context) {
        super(context);
    }

    /*This is where the magic happens*/
    @Override
    protected void onDraw(Canvas canvas){

        float offset = getTextSize() - getLineHeight();
        canvas.translate(0, offset);
        super.onDraw(canvas);
    }
}

다른 글꼴 크기 textView.setIncludeFontPadding(false)로 정렬했기 때문에 여전히 놀아야했습니다 TextViews.


DynamicMind 의 답변 에 TextView 주변에 공백이 표시되는 이유는 기본적으로 사용하는 9 패치 배경에 패딩 을 추가하고 싶었습니다 .

9- 패치 기술을 사용하면 효과적으로 패딩 인 콘텐츠 영역 을 지정할 수 있습니다 . 이 패딩은 뷰의 패딩을 명시 적으로 설정하지 않는 한 사용됩니다. 예를 들어 패딩이 설정된 뷰에 9 패치 배경을 프로그래밍 방식으로 설정하면 재정의됩니다. 반대로 패딩을 설정하면 9 패치 배경에서 설정 한 내용이 무시됩니다.

Unfortunately, in the XML layout it's not possible to determine the order of these operations. I think just removing the background from your TextViews would help:

android:background="@null"

public class TopAlignedTextView extends TextView {

    public TopAlignedTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TopAlignedTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs);
        setIncludeFontPadding(false); //remove the font padding
        setGravity(getGravity() | Gravity.TOP);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        TextPaint textPaint = getPaint();
        textPaint.setColor(getCurrentTextColor());
        textPaint.drawableState = getDrawableState();
        canvas.save();

        //remove extra font padding
        int yOffset = getHeight() - getBaseline();
        canvas.translate(0, - yOffset / 2);

        if (getLayout() != null) {
            getLayout().draw(canvas);
        }
        canvas.restore();
    }
}

Have you defined a layout margin? For example:

android:layout_marginTop="5dp"

Otherwise, if your text view is wrapped inside a LinearLayout or other container, then that cold have either padding or a margin too.


android:background="@android:drawable/editbox_background"

use it according to you change it that you want editbox_background. because android provide some build in background like above code choose according to your requirement. May be it is help full to you.


Inside a LinearLayout the default padding might be an issue. Try setting it to 0dp. It worked for me.


The answer of TopAlignedTextView code:TopAlignedTextView@GitHub

use it by layout:

<com.github.captain_miao.view.TopAlignedTextView
    android:id="@+id/text_a"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:text="@string/text_demo_a"
/>

여기에 이미지 설명 입력


이 문제를 해결하는 방법은 꽤 엉망이지만 텍스트 뷰의 높이를 정적으로 설정하고 텍스트에 거의 맞지 않을 때까지 조작하여 원하는 위치에 텍스트를 배치 할 수있었습니다. 제 경우에는 제가 사용했던 글꼴 스타일의 높이가 64sp 였으므로 textview의 높이를 50sp로 설정했는데 제대로 작동했습니다. 또한 전경 _ 중력을 하단으로 설정해야했습니다.


android : includeFontPadding = "false"

참고 URL : https://stackoverflow.com/questions/6593885/how-to-remove-the-top-and-bottom-space-on-textview-of-android

반응형