日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android布局如何空行,借用你的思路和框架,修复了空行、偶尔setText无效、padding设置的bug...

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android布局如何空行,借用你的思路和框架,修复了空行、偶尔setText无效、padding设置的bug... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

public class AlignTextView extends AppCompatTextView {

private List lines = new ArrayList(); // 分割后的行

private List tailLines = new ArrayList(); // 尾行

private Align align = Align.ALIGN_LEFT; // 默認最后一行左對齊

private float lineSpacingMultiplier = 1.0f;

private float lineSpacingAdd = 0.0f;

String oldText;

// 尾行對齊方式

public enum Align {

ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT // 居中,居左,居右,針對段落最后一行

}

public AlignTextView(Context context) {

super(context);

setTextIsSelectable(false);

}

public AlignTextView(Context context, AttributeSet attrs) {

super(context, attrs);

setTextIsSelectable(false);

lineSpacingMultiplier = attrs.getAttributeFloatValue("http://schemas.android" + "" +

".com/apk/res/android", "lineSpacingMultiplier", 1.0f);

int[] attributes = new int[]{android.R.attr.lineSpacingExtra};

TypedArray arr = context.obtainStyledAttributes(attrs, attributes);

lineSpacingAdd = arr.getDimensionPixelSize(0, 0);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 計算寬度

int heightMode = MeasureSpec.getMode(heightMeasureSpec);

int heightSize = MeasureSpec.getSize(heightMeasureSpec);

if (heightMode == MeasureSpec.EXACTLY) {

// 確定高度,直接返回

setMeasuredDimension(getMeasuredWidth(), heightSize);

} else {

recalc();

int height = lines.size() * getLineHeight();

if (heightMode == MeasureSpec.AT_MOST) {

// 最小高度

setMeasuredDimension(getMeasuredWidth(), Math.min(heightSize, height));

} else {

setMeasuredDimension(getMeasuredWidth(), height);

}

}

}

@Override

protected void onDraw(Canvas canvas) {

TextPaint paint = getPaint();

paint.setColor(getCurrentTextColor());

paint.drawableState = getDrawableState();

Paint.FontMetrics fm = paint.getFontMetrics();

float firstHeight = getTextSize() - (fm.bottom - fm.descent + fm.ascent - fm.top);

int gravity = getGravity();

if ((gravity & 0x1000) == 0) { // 是否垂直居中

firstHeight = firstHeight + (getTextSize() - firstHeight) / 2;

}

int paddingTop = getPaddingTop();

int paddingLeft = getPaddingLeft();

int paddingRight = getPaddingRight();

int width = getMeasuredWidth() - paddingLeft - paddingRight;

for (int i = 0; i < lines.size(); i++) {

float drawY = i * getLineHeight() + firstHeight;

String line = lines.get(i);

// 繪畫起始x坐標

float drawSpacingX = paddingLeft;

float gap = (width - paint.measureText(line));

float interval = gap / (line.length() - 1);

// 繪制最后一行

if (tailLines.contains(i)) {

interval = 0;

if (align == Align.ALIGN_CENTER) {

drawSpacingX += gap / 2;

} else if (align == Align.ALIGN_RIGHT) {

drawSpacingX += gap;

}

}

for (int j = 0; j < line.length(); j++) {

float drawX = paint.measureText(line.substring(0, j)) + interval * j;

canvas.drawText(line.substring(j, j + 1), drawX + drawSpacingX, drawY + paddingTop, paint);

}

}

}

/**

* 設置尾行對齊方式

*

* @param align 對齊方式

*/

public void setAlign(Align align) {

this.align = align;

invalidate();

}

private void recalc() {

String text = getText().toString();

if (text.equals(oldText))

return;

oldText = text;

TextPaint paint = getPaint();

lines.clear();

tailLines.clear();

// 文本含有換行符時,分割單獨處理

String[] items = text.split("\\n");

for (String item : items) {

calc(paint, item);

}

}

/**

* 計算每行應顯示的文本數

*

* @param text 要計算的文本

*/

private void calc(Paint paint, String text) {

if (text.length() == 0) {

lines.add("\n");

return;

}

int width = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();

int startPosition = 0; // 起始位置

StringBuilder sb = new StringBuilder();

for(int i = 0; i < text.length(); ++i) {

if(paint.measureText(text.substring(startPosition, i + 1)) > (float) width) {

startPosition = i;

this.lines.add(sb.toString());

sb = new StringBuilder();

i--;

} else {

sb.append(text.charAt(i));

}

}

if(sb.length() > 0) {

lines.add(sb.toString());

}

tailLines.add(Integer.valueOf(this.lines.size() - 1));

}

}

總結

以上是生活随笔為你收集整理的android布局如何空行,借用你的思路和框架,修复了空行、偶尔setText无效、padding设置的bug...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕第27页 | 精品国产一级 | 99er这里只有精品 | 最近2018年手机中文字幕版 | 国产传媒专区 | 九九热精品视频 | 婷婷色伊人 | 麻豆 美女 丝袜 人妻 中文 | 制服诱惑一区 | 日韩av无码中文字幕 | 一二三区在线 | www.激情五月 | 99久久精品无免国产免费 | 最新永久地址 | 亚洲熟妇一区二区三区 | 国产美女极度色诱视频www | 国产精品中文字幕在线观看 | 国产精品无码久久久久一区二区 | 国产精品23p | 双乳被四个男人吃奶h文 | 五月婷婷视频 | 欧美亚洲激情 | 国产黑人 | 超碰日韩| 日韩最新中文字幕 | 国产www免费观看 | 青青草一区二区 | 精品久久99| 国产免费一区二区三区视频 | 国产一区二区高清 | 亚洲av成人精品日韩在线播放 | 成人网在线免费观看 | 精品少妇一区二区三区 | 日韩第四页| 97人人模人人爽人人少妇 | 中文字幕校园春色 | 日韩一级在线观看视频 | 国产日韩视频一区 | 五月天激情综合网 | 亚州黄色 | 亚洲精品一区二区潘金莲 | av免费在线观看网站 | 欧美成人一区二区三区四区 | 观看毛片| 午夜视频| 爱射综合 | 免费色片网站 | 人乳videos巨大吃奶 | 日本在线| 久久咪咪 | 欧美xxxx69 | 91精品在线播放 | av最新地址 | 国产寡妇亲子伦一区二区三区四区 | 极品美女扒开粉嫩小泬 | 国产精品国产一区二区 | 黄色片中文字幕 | 裸体视频软件 | 国产成人精品国内自产拍免费看 | 国产精品一级黄片 | 欧美蜜桃视频 | 亚洲欧洲中文字幕 | 国产一区二区久久 | 中文字幕人成 | 男人天堂一区二区 | 丰满熟女一区二区三区 | 天天狠狠干 | 欧美成人免费视频 | 国产香蕉在线 | 久久99精品久久久久久三级 | 欧美三级中文字幕 | 色婷婷在线视频 | 欧美 国产 精品 | 91亚洲精品一区二区乱码 | 国产www | 欧美www| 少女忠诚电影高清免费 | 欧美一区二区三区激情啪啪 | 视频在线观看一区二区三区 | 亚洲欧美中文日韩在线观看 | 男生和女生操操 | 国产成人精品一区二区三区无码熬 | 黄色欧美在线 | 成年人的视频网站 | 嫩草伊人| 超碰成人在线观看 | 黄色福利 | 黄色免费大片 | 国产福利在线播放 | 91av免费在线观看 | 成人综合在线观看 | 亚洲同性gay激情无套 | 欧美性生交xxxxx久久久缅北 | 国产青青草视频 | 色网站入口 | 久久精品国产99久久不卡 | 一区二区三区国 | 手机av网 | 小泽玛利亚在线 |