国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android Text View 去掉默認(rèn)的padding的實(shí)現(xiàn)方法

這篇具有很好參考價(jià)值的文章主要介紹了Android Text View 去掉默認(rèn)的padding的實(shí)現(xiàn)方法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

先看下最終實(shí)現(xiàn)效果,滿意您在往下看:

Android Text View 去掉默認(rèn)的padding的實(shí)現(xiàn)方法,android,java

TextView 繪制的時(shí)候自帶一定的Padding值,要想實(shí)現(xiàn)去掉默認(rèn)的padding值,xml文件可以設(shè)置一個(gè)屬性值 :

android:includeFontPadding="false"

然后運(yùn)行起來就會(huì)發(fā)現(xiàn),并沒有什么卵用,也不能說完全沒有,但效果差點(diǎn)意思。我就不運(yùn)行了,在編譯器上也能大概看到效果,如下圖,我們可以看到依然有著無法刪除的padding值。

Android Text View 去掉默認(rèn)的padding的實(shí)現(xiàn)方法,android,java

我們先來看一下繪制TextView時(shí)的幾條基準(zhǔn)線:

Android Text View 去掉默認(rèn)的padding的實(shí)現(xiàn)方法,android,java

  • top:在給定文本大小下,字體中最高字形高于基線的最大距離,即能繪制的最高點(diǎn)
  • ascent:單倍行距文本的基線以上建議距離,即推薦的文字繪制上邊緣線
  • base:文字繪制基準(zhǔn)線,也就是坐標(biāo)軸,X軸就是Baseline
  • decent:單間距文本低于基線的建議距離,即推薦的文字繪制下邊緣線
  • bottom:能繪制的最低點(diǎn)

Textview繪制文字會(huì)在??ascentdecent?之間,外面的距離我們可以理解為 類似?padding一樣的間隔,但又并不是我們?cè)O(shè)置的paddingTop,paddingBottom。

要解決這個(gè)這個(gè)問題,首先我們要知道textview的內(nèi)容文字繪制的真實(shí)區(qū)域:

Android Text View 去掉默認(rèn)的padding的實(shí)現(xiàn)方法,android,java

紅色的區(qū)域就是內(nèi)容的真實(shí)高度,藍(lán)色的部分就是textview繪制的多余的部分,現(xiàn)在我們要去掉這一部分,首先可以通過?getTextBounds 來獲取繪制的真實(shí)區(qū)域

textView.getPaint().getTextBounds(text, 0, text.length(), textRect);

獲取到真實(shí)區(qū)域后,那么再來看textview繪制的幾條基準(zhǔn)線,你想到了什么,是的,我們只需要稍微移動(dòng)一下這幾條線把高度壓縮到文字的展示繪制區(qū)域即可,實(shí)現(xiàn)用 SpannableString 來實(shí)現(xiàn),SpannableString 是 android? 里面專門用來實(shí)現(xiàn)設(shè)置 textview 文字樣式的類,這個(gè)不清楚的自行查詢一下,這里不贅述了,具體我們用的是??LineHeightSpan ,可以通過修改 textview 的行高來實(shí)現(xiàn)我們的目的。具體看下代碼:

spannableString.setSpan(new LineHeightSpan() {
    @Override
    public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int lineHeight, Paint.FontMetricsInt fm) {
        Rect textRect = new Rect();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            textView.getPaint().getTextBounds(text, 0, text.length(), textRect);
        } else {
            textView.getPaint().getTextBounds(text.toString(), 0, text.length(), textRect);
        }
        // 直接把 textview 繪制區(qū)域 縮小到 文字真實(shí)大小的區(qū)域
        // 這個(gè)是有一點(diǎn)問題的,看下圖
        fm.top = textRect.top;
        fm.bottom = textRect.bottom;
        fm.ascent = fm.top;
        fm.descent = fm.bottom;
    }
}, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

?Paint.FontMetricsInt 里的 top bottom ascent descent 就是用來調(diào)整 繪制的時(shí)候的具體位置的,我們把textview的繪制區(qū)域直接設(shè)置到?FontMetricsInt 里面,實(shí)現(xiàn)的效果如下圖:

Android Text View 去掉默認(rèn)的padding的實(shí)現(xiàn)方法,android,java

看起來確實(shí)去掉了padding,而且去的干干凈凈,需要這種效果的可以停下來,施展CV大法。

這種實(shí)現(xiàn)方式原理也很簡單,是使文字真實(shí)的繪制區(qū)域高度為所繪制內(nèi)容中字符的最大高度,這樣可能會(huì)造成排版問題,文字對(duì)不齊,那我們就需要統(tǒng)一下繪制內(nèi)容的高度,我們知道TextView 有個(gè)屬性TextSize ,它的值最終決定了Textview 的高度,然后我們略微修改一下代碼:

spannableString.setSpan(new LineHeightSpan() {
    @Override
    public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int lineHeight, Paint.FontMetricsInt fm) {
        Rect textRect = new Rect();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            textView.getPaint().getTextBounds(text, 0, text.length(), textRect);
        } else {
            textView.getPaint().getTextBounds(text.toString(), 0, text.length(), textRect);
        }

        Log.e("NoPaddingText", "修改之前 " + fm.toString());
        Log.e("NoPaddingText", textRect.toString());
        Log.e("NoPaddingText", "textSize: " + textView.getTextSize());

        if (textRect.bottom - textRect.top < textView.getTextSize()) {
            // 一般我們認(rèn)為字體的textview的textsize為textview的高度,當(dāng)然有一定的誤差
            // 當(dāng)字體的高度沒有字體的textsize大時(shí),我們把大小設(shè)置成textsize,這樣就可以解決文字的排版問題了
            float tempPadding = (textView.getTextSize() - (textRect.bottom - textRect.top)) / 2f;
            fm.top = (int) (textRect.top - tempPadding);
            fm.bottom = (int) (textRect.bottom + tempPadding);
        } else {
            fm.top = textRect.top;
            fm.bottom = textRect.bottom;
        }
        fm.ascent = fm.top;
        fm.descent = fm.bottom;
        Log.e("NoPaddingText", "修改之后 " + fm.toString());
    }
}, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

我們用TextView的TextSize來約束統(tǒng)一繪制高度,不足TextSize 的,補(bǔ)充添加一個(gè)padding值補(bǔ)齊正常的高度,實(shí)現(xiàn)效果如下:

Android Text View 去掉默認(rèn)的padding的實(shí)現(xiàn)方法,android,java

這樣看著順眼多了,繼續(xù)CV大法。

完整代碼如下:(兩種實(shí)現(xiàn)形式:1、工具類; 2、自定義View形式實(shí)現(xiàn))

點(diǎn)這里跳轉(zhuǎn)項(xiàng)目源碼地址文章來源地址http://www.zghlxwxcb.cn/news/detail-805446.html

import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Build;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.LineHeightSpan;
import android.util.Log;
import android.widget.TextView;

// 工具類 實(shí)現(xiàn)
public class TextUtil {

    // 設(shè)置上下取消繪制的padding值 考慮textsize
    public static void setNoVerticalPaddingText(TextView textView, CharSequence text) {
        if (textView == null || text == null)
            return;
        // 如果原先上下有padding,重置為 0
        textView.setPadding(textView.getPaddingLeft(), 0, textView.getPaddingRight(), 0);
        // 利用 LineHeightSpan 快速實(shí)現(xiàn)去除 padding 的效果
        SpannableString spannableString = new SpannableString(text);
        spannableString.setSpan(new LineHeightSpan() {
            @Override
            public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int lineHeight, Paint.FontMetricsInt fm) {
                Rect textRect = new Rect();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    textView.getPaint().getTextBounds(text, 0, text.length(), textRect);
                } else {
                    textView.getPaint().getTextBounds(text.toString(), 0, text.length(), textRect);
                }

                Log.e("NoPaddingText", "修改之前 " + fm.toString());
                Log.e("NoPaddingText", textRect.toString());
                Log.e("NoPaddingText", "textSize: " + textView.getTextSize());

                if (textRect.bottom - textRect.top < textView.getTextSize()) {
                    // 一般我們認(rèn)為字體的textview的textsize為textview的高度,當(dāng)然有一定的誤差 當(dāng)然也可以自定義View 形式
                    // 當(dāng)字體的高度沒有字體的textsize大時(shí),我們把大小設(shè)置成textsize,這樣就可以解決文字的排版問題了
                    float tempPadding = (textView.getTextSize() - (textRect.bottom - textRect.top)) / 2f;
                    fm.top = (int) (textRect.top - tempPadding);
                    fm.bottom = (int) (textRect.bottom + tempPadding);
                } else {
                    // 這么設(shè)置可以完全消除padding,但是會(huì)有問題,
                    // 同樣textsize的Textview 會(huì)因?yàn)樵O(shè)置的內(nèi)容不一樣而高度不一樣
                    // 如果有什么特殊需求可以考慮用一下
                    fm.top = textRect.top;
                    fm.bottom = textRect.bottom;
                }
                fm.ascent = fm.top;
                fm.descent = fm.bottom;
                Log.e("NoPaddingText", "修改之后 " + fm.toString());
            }
        }, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        textView.setText(spannableString);
    }


    // 設(shè)置上下取消繪制的padding值 不考慮textsize
    public static void setNoVerticalPaddingText2(TextView textView, CharSequence text) {
        if (textView == null || text == null)
            return;
        // 如果原先上下有padding,重置為 0
        textView.setPadding(textView.getPaddingLeft(), 0, textView.getPaddingRight(), 0);
        // 利用 LineHeightSpan 快速實(shí)現(xiàn)去除 padding 的效果
        SpannableString spannableString = new SpannableString(text);
        spannableString.setSpan(new LineHeightSpan() {
            @Override
            public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int lineHeight, Paint.FontMetricsInt fm) {
                Rect textRect = new Rect();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    textView.getPaint().getTextBounds(text, 0, text.length(), textRect);
                } else {
                    textView.getPaint().getTextBounds(text.toString(), 0, text.length(), textRect);
                }

                Log.e("NoPaddingText", "修改之前 " + fm.toString());
                Log.e("NoPaddingText", textRect.toString());
                Log.e("NoPaddingText", "textSize: " + textView.getTextSize());

                // 這么設(shè)置可以完全消除padding,但是會(huì)有問題,
                // 同樣textsize的Textview 會(huì)因?yàn)樵O(shè)置的內(nèi)容不一樣而高度不一樣
                // 如果有什么特殊需求可以考慮用一下
                fm.top = textRect.top;
                fm.bottom = textRect.bottom;
                fm.ascent = fm.top;
                fm.descent = fm.bottom;
                Log.e("NoPaddingText", "修改之后 " + fm.toString());
            }
        }, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        textView.setText(spannableString);
    }

}
import android.content.Context;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Build;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.LineHeightSpan;
import android.util.AttributeSet;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;

/**
 * 自定義view 形式 實(shí)現(xiàn) NoPaddingTextView 布局可以預(yù)覽
 */
public class NoPaddingTextView extends AppCompatTextView {


    public NoPaddingTextView(@NonNull Context context) {
        this(context, null);
    }

    public NoPaddingTextView(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public NoPaddingTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(getNoVerticalPaddingText(this,text), type);
    }

    // 設(shè)置上下取消繪制的padding值 考慮textsize
    public final SpannableString getNoVerticalPaddingText(TextView textView, CharSequence text) {
        if (textView == null || text == null)
            return new SpannableString("");
        // 如果原先上下有padding,重置為 0
        textView.setPadding(textView.getPaddingLeft(), 0, textView.getPaddingRight(), 0);
        // 利用 LineHeightSpan 快速實(shí)現(xiàn)去除 padding 的效果
        SpannableString spannableString = new SpannableString(text);
        spannableString.setSpan(new LineHeightSpan() {
            @Override
            public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int lineHeight, Paint.FontMetricsInt fm) {
                Rect textRect = new Rect();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    textView.getPaint().getTextBounds(text, 0, text.length(), textRect);
                } else {
                    textView.getPaint().getTextBounds(text.toString(), 0, text.length(), textRect);
                }

                //Log.e("NoPaddingText", "修改之前 " + fm.toString());
                //Log.e("NoPaddingText", textRect.toString());
                //Log.e("NoPaddingText", "textSize: " + textView.getTextSize());

                if (textRect.bottom - textRect.top < textView.getTextSize()) {
                    // 一般我們認(rèn)為字體的textview的textsize為textview的高度,當(dāng)然有一定的誤差 當(dāng)然也可以自定義View 形式
                    // 當(dāng)字體的高度沒有字體的textsize大時(shí),我們把大小設(shè)置成textsize,這樣就可以解決文字的排版問題了
                    float tempPadding = (textView.getTextSize() - (textRect.bottom - textRect.top)) / 2f;
                    fm.top = (int) (textRect.top - tempPadding);
                    fm.bottom = (int) (textRect.bottom + tempPadding);
                } else {
                    // 這么設(shè)置可以完全消除padding,但是會(huì)有問題,
                    // 同樣textsize的Textview 會(huì)因?yàn)樵O(shè)置的內(nèi)容不一樣而高度不一樣
                    // 如果有什么特殊需求可以考慮用一下
                    fm.top = textRect.top;
                    fm.bottom = textRect.bottom;
                }
                fm.ascent = fm.top;
                fm.descent = fm.bottom;
                //Log.e("NoPaddingText", "修改之后 " + fm.toString());
            }
        }, 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        return spannableString;
    }
}

到了這里,關(guān)于Android Text View 去掉默認(rèn)的padding的實(shí)現(xiàn)方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Android】自定義View onDraw()方法會(huì)調(diào)用兩次

    【Android】自定義View onDraw()方法會(huì)調(diào)用兩次

    自定義了View后,在構(gòu)造函數(shù)中設(shè)置畫筆顏色,發(fā)現(xiàn)它沒起效,但是在onDraw()里設(shè)置顏色就會(huì)起效,出問題的代碼如下: 我在構(gòu)造函數(shù)中設(shè)置的畫筆顏色是紅色,但是實(shí)際畫出的線是黑色的(畫筆默認(rèn)顏色是黑色),分析了一下發(fā)現(xiàn)是paint.reset()的問題,reset就是畫筆重置設(shè)置嘛

    2024年01月19日
    瀏覽(19)
  • Android View實(shí)現(xiàn)滑動(dòng)的方式

    實(shí)現(xiàn)View的滑動(dòng)有三種方式 通過View本身提供的scrollTo/scrollBy方法實(shí)現(xiàn)滑動(dòng) 通過動(dòng)畫給View施加平移效果來實(shí)現(xiàn)滑動(dòng) 通過改變View LayoutParams使得View重新布局從而實(shí)現(xiàn)滑動(dòng) scrollTo:通過傳遞的參數(shù)實(shí)現(xiàn)絕對(duì)滑動(dòng) scrollBy:通過傳遞的參數(shù)實(shí)現(xiàn)相對(duì)滑動(dòng) scrollTo和scrollBy只能改變View內(nèi)容

    2024年02月16日
    瀏覽(28)
  • Android 11.0 SystemUI 去掉狀態(tài)欄wifi流量上下行圖標(biāo)功能實(shí)現(xiàn)

    ? 在11.0系統(tǒng)定制rom開發(fā)中,在關(guān)于systemui的定制功能總,在SystemUI 狀態(tài)欄上顯示時(shí)鐘,電池電量 wifi圖標(biāo),在顯示wifi圖標(biāo)時(shí),網(wǎng)絡(luò)實(shí)時(shí)更新時(shí),但是會(huì)時(shí)不時(shí)顯示上下行圖標(biāo) 顯得很不美觀,客戶需求要求不顯示上下行圖標(biāo),所以需要去掉上下行圖標(biāo)功能,接下來實(shí)現(xiàn)相關(guān)功能開

    2024年02月04日
    瀏覽(124)
  • Android自定義View之游戲搖桿鍵盤實(shí)現(xiàn)(一),快手android面試經(jīng)驗(yàn)

    Android自定義View之游戲搖桿鍵盤實(shí)現(xiàn)(一),快手android面試經(jīng)驗(yàn)

    public class RemoteViewBg { private Bitmap bitmapBg; public RemoteViewBg(Bitmap bitmap) { bitmapBg = bitmap; } //背景的繪圖函數(shù) public void draw(Canvas canvas, Paint paint, Rect src0 ,Rect dst0 ) { canvas.drawBitmap(bitmapBg, src0, dst0, paint); } } 重寫系統(tǒng)的觸摸時(shí)間,判斷觸摸點(diǎn)在背景范圍內(nèi)還是背景范圍外 @Override public b

    2024年04月12日
    瀏覽(17)
  • Android自定義View之游戲搖桿鍵盤實(shí)現(xiàn)(一)

    Android自定義View之游戲搖桿鍵盤實(shí)現(xiàn)(一)

    public class RemoteViewBg { private Bitmap bitmapBg; public RemoteViewBg(Bitmap bitmap) { bitmapBg = bitmap; } //背景的繪圖函數(shù) public void draw(Canvas canvas, Paint paint, Rect src0 ,Rect dst0 ) { canvas.drawBitmap(bitmapBg, src0, dst0, paint); } } 重寫系統(tǒng)的觸摸時(shí)間,判斷觸摸點(diǎn)在背景范圍內(nèi)還是背景范圍外 @Override public b

    2024年04月17日
    瀏覽(22)
  • Android View轉(zhuǎn)換為Bitmap,實(shí)現(xiàn)截屏效果

    ? ? ? ? 安卓設(shè)備一般都自帶截圖功能,但是用戶體驗(yàn)有不好之處。就是會(huì)連帶著狀態(tài)欄??、??、時(shí)間日期、其他不必要頁面中信息,等等與用戶想截屏的內(nèi)容不符的信息也會(huì)被保存下來。通常,截圖后用戶會(huì)再次裁剪一次才能想把真正需求分享出去。 ? ? ? ? 因此,咱們

    2023年04月08日
    瀏覽(20)
  • Android 12 內(nèi)置系統(tǒng)默認(rèn)動(dòng)態(tài)壁紙(視頻資源)實(shí)現(xiàn)

    新建APP 項(xiàng)目 實(shí)現(xiàn) WallpaperService 實(shí)現(xiàn)視頻播放的引擎 AndroidManifest.xml 里注冊(cè)服務(wù) 其中的 intent-filter 、action 、meta-data 都是固定寫法,用于系統(tǒng)識(shí)別,我們需要配置的是 后面的 android:resource=“@xml/magic” 資源配置 @xml/magic 在 res 目錄下,新建 xml 文件夾 然后新建 xxxx.xml(如本例:

    2023年04月26日
    瀏覽(37)
  • Android 打包AAB+PAD(Unity篇),Android開發(fā)基礎(chǔ)面試題

    Android 打包AAB+PAD(Unity篇),Android開發(fā)基礎(chǔ)面試題

    這些部分適用于**「fast-follow」 和 「on-demand」**資產(chǎn)包。 檢查狀態(tài) 每個(gè)資產(chǎn)包都存儲(chǔ)在應(yīng)用程序內(nèi)部存儲(chǔ)的單獨(dú)文件夾中。使用該 「isDownloaded()」 方法確定是否已下載資產(chǎn)包。 監(jiān)控下載 查詢PlayAssetBundleRequest 監(jiān)控請(qǐng)求狀態(tài)的 對(duì)象: //?Download?progress?of?request,?between?0.0f?

    2024年04月14日
    瀏覽(19)
  • Android去掉視頻聲音

    【Android】使用MediaExtractor、MediaMuxer去掉視頻文件中的音頻數(shù)據(jù)_android 去掉視頻音頻_little_fat_sheep的博客-CSDN博客 選擇視頻文件

    2024年02月10日
    瀏覽(14)
  • Android終極大招之全面取代drawble文件實(shí)現(xiàn)View圓角背景樣式的新方案

    Android終極大招之全面取代drawble文件實(shí)現(xiàn)View圓角背景樣式的新方案

    最近一直忙于音視頻SDK的開發(fā),遇到很多問題,簡單來說,就是怎么讓別人接入SDK時(shí)越簡單越好。相信大多數(shù)Android開發(fā)都會(huì)遇到一個(gè)場(chǎng)景,給TextView或Button添加背景顏色,修改圓角,描邊等需求。一看到這樣的實(shí)現(xiàn)效果,自然就是創(chuàng)建drawble文件,設(shè)置相關(guān)屬性shap,color,ra

    2024年02月07日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包