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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android使组件居中,Android图文居中显示控件使用方法详解

發布時間:2024/9/19 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android使组件居中,Android图文居中显示控件使用方法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近項目中用到了文字圖標的按鈕,需要居中顯示,如果用TextView實現的方式,必須同時設置padding和drawablePadding。如下:

android:layout_width="200dp"

android:layout_height="wrap_content"

android:drawableLeft="@drawable/ic_xxx"

android:drawablePadding="-60dp"

android:minHeight="48dp"

android:gravity="center"

android:padding="80dp" />

這種方式需要自己做精確計算。比較麻煩。另外還有一種方式就是用線性布局包裹ImageView和TextView,但這樣會增加布局層級。于是自己封裝了一個控件DrawableCenterTextView。

attrs.xml文件中定義屬性:

對應的Java代碼如下:

public class DrawableCenterTextView extends View {

static final int LEFT = 0;

static final int TOP = 1;

static final int RIGHT = 2;

static final int BOTTOM = 3;

private CharSequence mText;

private ColorStateList mTextColor;

private float mTextSize;

private int mTextStyle;

private int mDrawablePadding;

private Drawable[] mCompoundDrawables;

private Rect mTextBounds;

private Rect mDrawableLeftBounds;

private Rect mDrawableTopBounds;

private Rect mDrawableRightBounds;

private Rect mDrawableBottomBounds;

private TextPaint mTextPaint;

public DrawableCenterTextView(Context context) {

this(context, null);

}

public DrawableCenterTextView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public DrawableCenterTextView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

Drawable drawableLeft = null, drawableTop = null, drawableRight = null, drawableBottom = null;

TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.DrawableCenterTextView, defStyleAttr, 0);

mText = ta.getText(R.styleable.DrawableCenterTextView_android_text);

mTextColor = ta.getColorStateList(R.styleable.DrawableCenterTextView_android_textColor);

mTextSize = ta.getDimensionPixelSize(R.styleable.DrawableCenterTextView_android_textSize, 15);

mTextStyle = ta.getInt(R.styleable.DrawableCenterTextView_android_textStyle, 0);

drawableLeft = ta.getDrawable(R.styleable.DrawableCenterTextView_android_drawableLeft);

drawableTop = ta.getDrawable(R.styleable.DrawableCenterTextView_android_drawableTop);

drawableRight = ta.getDrawable(R.styleable.DrawableCenterTextView_android_drawableRight);

drawableBottom = ta.getDrawable(R.styleable.DrawableCenterTextView_android_drawableBottom);

mDrawablePadding = ta.getDimensionPixelSize(R.styleable.DrawableCenterTextView_android_drawablePadding, 0);

ta.recycle();

if (mTextColor == null) {

mTextColor = ColorStateList.valueOf(0xFF000000);

}

mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);

mTextPaint.density = getResources().getDisplayMetrics().density;

mTextPaint.setTextSize(mTextSize);

setTypeface(Typeface.create(Typeface.DEFAULT, mTextStyle));

setCompoundDrawablesWithIntrinsicBounds(drawableLeft, drawableTop, drawableRight, drawableBottom);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int widthMode = MeasureSpec.getMode(widthMeasureSpec);

int heightMode = MeasureSpec.getMode(heightMeasureSpec);

int widthSize = MeasureSpec.getSize(widthMeasureSpec);

int heightSize = MeasureSpec.getSize(heightMeasureSpec);

int width;

int height;

//計算文本范圍

calcTextBounds();

if (widthMode == MeasureSpec.EXACTLY) {

width = widthSize;

} else {

width = mTextBounds.width();

if (mCompoundDrawables != null) {

if (mCompoundDrawables[TOP] != null) {

width = Math.max(width, mDrawableTopBounds.width());

}

if (mCompoundDrawables[BOTTOM] != null) {

width = Math.max(width, mDrawableBottomBounds.width());

}

//加上左右內邊距及drawable寬度和drawable間距

width += getCompoundPaddingLeft() + getCompoundPaddingRight();

width = Math.max(width, getSuggestedMinimumWidth());

if (widthMode == MeasureSpec.AT_MOST) {

width = Math.min(widthSize, width);

}

}

}

if (heightMode == MeasureSpec.EXACTLY) {

height = heightSize;

} else {

height = mTextBounds.height();

if (mCompoundDrawables != null) {

if (mCompoundDrawables[LEFT] != null) {

height = Math.max(height, mDrawableLeftBounds.height());

}

if (mCompoundDrawables[RIGHT] != null) {

height = Math.max(height, mDrawableRightBounds.height());

}

//加上上下內邊距及drawable高度和drawable間距

height += getCompoundPaddingTop() + getCompoundPaddingBottom();

height = Math.max(height, getSuggestedMinimumHeight());

if (heightMode == MeasureSpec.AT_MOST) {

height = Math.min(heightSize, height);

}

}

}

setMeasuredDimension(width, height);

}

public int getCompoundPaddingTop() {

if (mCompoundDrawables == null || mCompoundDrawables[TOP] == null) {

return getPaddingTop();

} else {

Rect rect = new Rect();

mCompoundDrawables[TOP].copyBounds(rect);

return getPaddingTop() + mDrawablePadding + rect.height();

}

}

public int getCompoundPaddingBottom() {

if (mCompoundDrawables == null || mCompoundDrawables[BOTTOM] == null) {

return getPaddingBottom();

} else {

Rect rect = new Rect();

mCompoundDrawables[BOTTOM].copyBounds(rect);

return getPaddingBottom() + mDrawablePadding + rect.height();

}

}

public int getCompoundPaddingLeft() {

if (mCompoundDrawables == null || mCompoundDrawables[LEFT] == null) {

return getPaddingLeft();

} else {

Rect rect = new Rect();

mCompoundDrawables[LEFT].copyBounds(rect);

return getPaddingLeft() + mDrawablePadding + rect.width();

}

}

public int getCompoundPaddingRight() {

if (mCompoundDrawables == null || mCompoundDrawables[RIGHT] == null) {

return getPaddingRight();

} else {

Rect rect = new Rect();

mCompoundDrawables[RIGHT].copyBounds(rect);

return getPaddingRight() + mDrawablePadding + rect.width();

}

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

int vspace = getBottom() - getTop() - getCompoundPaddingBottom() - getCompoundPaddingTop(); //剩余垂直可繪制文本空間大小

int hspace = getRight() - getLeft() - getCompoundPaddingRight() - getCompoundPaddingLeft(); //剩余水平可繪制文本空間大小

if (mCompoundDrawables != null) {

if (mCompoundDrawables[LEFT] != null) {

canvas.save();

canvas.translate((hspace - mTextBounds.width()) / 2.0f + getPaddingLeft(),

getCompoundPaddingTop() + (vspace - mDrawableLeftBounds.height()) / 2.0f);

mCompoundDrawables[LEFT].draw(canvas);

canvas.restore();

}

if (mCompoundDrawables[RIGHT] != null) {

canvas.save();

canvas.translate(getRight() - getLeft() - getPaddingRight() - (hspace - mTextBounds.width()) / 2.0f - mDrawableRightBounds.width(),

getCompoundPaddingTop() + (vspace - mDrawableRightBounds.height()) / 2.0f);

mCompoundDrawables[RIGHT].draw(canvas);

canvas.restore();

}

if (mCompoundDrawables[TOP] != null) {

canvas.save();

canvas.translate(getCompoundPaddingLeft()

+ (hspace - mDrawableTopBounds.width()) / 2.0f, (vspace - mTextBounds.height()) / 2.0f + getPaddingTop());

mCompoundDrawables[TOP].draw(canvas);

canvas.restore();

}

if (mCompoundDrawables[BOTTOM] != null) {

canvas.save();

canvas.translate(getCompoundPaddingLeft()

+ (hspace - mDrawableBottomBounds.width()) / 2.0f,

getBottom() - getTop() - getPaddingBottom() - (vspace - mTextBounds.height()) / 2.0f - mDrawableBottomBounds.height());

mCompoundDrawables[BOTTOM].draw(canvas);

canvas.restore();

}

}

if (!TextUtils.isEmpty(mText)) {

float startX = (hspace - mTextBounds.width()) / 2.0f + getCompoundPaddingLeft();

//因為drawText以baseline為基準,因此需要向下移ascent

float startY = (vspace - mTextBounds.height()) / 2.0f + getCompoundPaddingTop() - mTextPaint.getFontMetrics().ascent;

mTextPaint.setColor(mTextColor.getColorForState(getDrawableState(), 0));

canvas.drawText(mText, 0, mText.length(), startX, startY, mTextPaint);

}

}

@Override

protected void drawableStateChanged() {

super.drawableStateChanged();

if (mTextColor != null && mTextColor.isStateful()) {

mTextPaint.setColor(mTextColor.getColorForState(getDrawableState(), 0));

}

if (mCompoundDrawables != null) {

final int[] state = getDrawableState();

for (Drawable dr : mCompoundDrawables) {

if (dr != null && dr.isStateful() && dr.setState(state)) {

invalidateDrawable(dr);

}

}

}

}

public void setCompoundDrawablesWithIntrinsicBounds(@Nullable Drawable left,

@Nullable Drawable top, @Nullable Drawable right, @Nullable Drawable bottom) {

if (left != null) {

left.setBounds(0, 0, left.getIntrinsicWidth(), left.getIntrinsicHeight());

}

if (right != null) {

right.setBounds(0, 0, right.getIntrinsicWidth(), right.getIntrinsicHeight());

}

if (top != null) {

top.setBounds(0, 0, top.getIntrinsicWidth(), top.getIntrinsicHeight());

}

if (bottom != null) {

bottom.setBounds(0, 0, bottom.getIntrinsicWidth(), bottom.getIntrinsicHeight());

}

setCompoundDrawables(left, top, right, bottom);

}

public void setCompoundDrawables(@Nullable Drawable left, @Nullable Drawable top,

@Nullable Drawable right, @Nullable Drawable bottom) {

if (mCompoundDrawables == null) {

mCompoundDrawables = new Drawable[4];

} else {

if (mCompoundDrawables[LEFT] != null && mCompoundDrawables[LEFT] != left) {

mCompoundDrawables[LEFT].setCallback(null);

}

if (mCompoundDrawables[TOP] != null && mCompoundDrawables[TOP] != top) {

mCompoundDrawables[TOP].setCallback(null);

}

if (mCompoundDrawables[RIGHT] != null && mCompoundDrawables[RIGHT] != right) {

mCompoundDrawables[RIGHT].setCallback(null);

}

if (mCompoundDrawables[BOTTOM] != null && mCompoundDrawables[BOTTOM] != bottom) {

mCompoundDrawables[BOTTOM].setCallback(null);

}

}

if (left != null) {

mDrawableLeftBounds = new Rect();

left.copyBounds(mDrawableLeftBounds);

left.setCallback(this);

mCompoundDrawables[LEFT] = left;

} else {

mCompoundDrawables[LEFT] = null;

}

if (top != null) {

mDrawableTopBounds = new Rect();

top.copyBounds(mDrawableTopBounds);

top.setCallback(this);

mCompoundDrawables[TOP] = top;

} else {

mCompoundDrawables[TOP] = null;

}

if (right != null) {

mDrawableRightBounds = new Rect();

right.copyBounds(mDrawableRightBounds);

right.setCallback(this);

mCompoundDrawables[RIGHT] = right;

} else {

mCompoundDrawables[RIGHT] = null;

}

if (bottom != null) {

mDrawableBottomBounds = new Rect();

bottom.copyBounds(mDrawableBottomBounds);

bottom.setCallback(this);

mCompoundDrawables[BOTTOM] = bottom;

} else {

mCompoundDrawables[BOTTOM] = null;

}

invalidate();

requestLayout();

}

public void setText(CharSequence text) {

this.mText = text;

invalidate();

requestLayout();

}

public void setTextSize(float textSize) {

this.mTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, textSize, getResources().getDisplayMetrics());

invalidate();

requestLayout();

}

public void setTextColor(@ColorInt int textColor) {

this.mTextColor = ColorStateList.valueOf(textColor);

invalidate();

}

public void setTypeface(@Nullable Typeface tf) {

if (mTextPaint.getTypeface() != tf) {

mTextPaint.setTypeface(tf);

requestLayout();

invalidate();

}

}

private void calcTextBounds() {

mTextBounds = new Rect();

if (TextUtils.isEmpty(mText)) return;

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {

mTextPaint.getTextBounds(mText, 0, mText.length(), mTextBounds);

} else {

int width = (int) Math.ceil(mTextPaint.measureText(mText.toString()));

Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();

int height = (int) Math.ceil(fontMetrics.descent - fontMetrics.ascent);

mTextBounds.set(0, 0, width, height);

}

}

}

感謝大家的支持,如有錯誤請指正。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的android使组件居中,Android图文居中显示控件使用方法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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