android textview动态设置drawabletop,android TextView 设置Drawable的大小

电玩女神 2022-10-16 07:33 489阅读 0赞

在项目中,经常会遇到文字旁边是图片的UI,使用LinearLayout布局显得非常累赘,且会影响性能,最明智的方法是自定义一个TextView,实现方法如下:

public class TextDrawable extends android.support.v7.widget.AppCompatTextView {

private Drawable drawableLeft;

private Drawable drawableRight;

private Drawable drawableTop;

private int leftWidth;

private int rightWidth;

private int topWidth;

private int leftHeight;

private int rightHeight;

private int topHeight;

private Context mContext;

public TextDrawable(Context context) {

super(context);

this.mContext = context;

init(context, null);

}

public TextDrawable(Context context, AttributeSet attrs) {

super(context, attrs);

this.mContext = context;

init(context, attrs);

}

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

super(context, attrs, defStyleAttr);

this.mContext = context;

init(context, attrs);

}

private void init(Context context, AttributeSet attrs) {

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TextDrawable);

drawableLeft = typedArray.getDrawable(R.styleable.TextDrawable_leftDrawable);

drawableRight = typedArray.getDrawable(R.styleable.TextDrawable_rightDrawable);

drawableTop = typedArray.getDrawable(R.styleable.TextDrawable_topDrawable);

if (drawableLeft != null) {

leftWidth = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_leftDrawableWidth, dip2px(context, 20));

leftHeight = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_leftDrawableHeight, dip2px(context, 20));

}

if (drawableRight != null) {

rightWidth = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_rightDrawableWidth, dip2px(context, 20));

rightHeight = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_rightDrawableHeight, dip2px(context, 20));

}

if (drawableTop != null) {

topWidth = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_topDrawableWidth, dip2px(context, 20));

topHeight = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_topDrawableHeight, dip2px(context, 20));

}

}

public int dip2px(Context context, float dpValue) {

final float scale = context.getResources().getDisplayMetrics().density;

return (int) (dpValue * scale + 0.5f);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

if (drawableLeft != null) {

drawableLeft.setBounds(0, 0, leftWidth, leftHeight);

}

if (drawableRight != null) {

drawableRight.setBounds(0, 0, rightWidth, rightHeight);

}

if (drawableTop != null) {

drawableTop.setBounds(0, 0, topWidth, topHeight);

}

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

this.setCompoundDrawables(drawableLeft, drawableTop, drawableRight, null);

}

/**

* 设置左侧图片并重绘

*/

public void setDrawableLeft(Drawable drawableLeft) {

this.drawableLeft = drawableLeft;

invalidate();

}

/**

* 设置左侧图片并重绘

*/

public void setDrawableLeft(int drawableLeftRes) {

this.drawableLeft = mContext.getResources().getDrawable(drawableLeftRes);

invalidate();

}

/**

* 设置右侧图片并重绘

*/

public void setDrawableRight(Drawable drawableRight) {

this.drawableRight = drawableLeft;

invalidate();

}

/**

* 设置右侧图片并重绘

*/

public void setDrawableRight(int drawableRightRes) {

this.drawableRight = mContext.getResources().getDrawable(drawableRightRes);

invalidate();

}

/**

* 设置上部图片并重绘

*/

public void setDrawable(Drawable drawableTop) {

this.drawableTop = drawableTop;

invalidate();

}

/**

* 设置右侧图片并重绘

*/

public void setDrawableTop(int drawableTopRes) {

this.drawableTop = mContext.getResources().getDrawable(drawableTopRes);

invalidate();

}

}

其中attrs.xml中属性定义如下:

在xml中使用方法如下:

android:layout_width=”0dp”

android:layout_height=”wrap_content”

android:layout_weight=”1”

android:drawablePadding=”17dp”

android:gravity=”center”

android:text=”@string/xxx”

android:textSize=”16dp”

app:topDrawable=”@mipmap/xxx”

app:topDrawableHeight=”67dp”

app:topDrawableWidth=”67dp” />

发表评论

表情:
评论列表 (有 0 条评论,489人围观)

还没有评论,来说两句吧...

相关阅读

    相关 TextView设置字体

    / 这个是用来设置字体的,比如设置显示的TextView为微软雅黑字体或者宋体、楷体等,跟大小颜色等属性无关; 将 TTF等格式的字体文件放在app-s