android添加浮动组件,android – 如何将文本添加到浮动操作按钮?

在我们的项目中,我们使用名为TextDrawable的自定义类.这个类扩展了Drawable,在它的方法draw(Canvas)中,它简单地在画布上绘制文本.这个类适合我们的特定需求,但我认为,这个想法(主要是在draw()方法中会帮助你:

public class TextDrawable extends Drawable {

protected final Paint textPaint;

protected ColorStateList color;

protected String text;

protected int iHeight;

protected int iWidth;

protected int measuredWidth,measuredHeight;

private float ascent;

/**

* A flag whether the drawable is stateful - whether to redraw if the state of view has changed

*/

protected boolean stateful;

/**

* Vertical alignment of text

*/

private VerticalAlignment verticalAlignment;

.... some constructors...

public TextDrawable(Context ctx,String text,ColorStateList color,float textSize,VerticalAlignment verticalAlignment) {

textPaint = new Paint();

this.text = text;

initPaint();

this.textPaint.setTextSize(textSize);

measureSize();

setBounds(0,iWidth,iHeight);

this.color = color;

textPaint.setColor(color.getDefaultColor());

this.verticalAlignment = verticalAlignment;

}

/**

* Set bounds of drawable to start on coordinate [0,0] and end on coordinate[measuredWidth,* measuredHeight]

*/

public final void setBoundsByMeasuredSize() {

setBounds(0,measuredWidth,measuredHeight);

invalidateSelf();

}

@Override

public boolean isStateful() {

return stateful;

}

public void setStateful(boolean stateful) {

this.stateful = stateful;

}

private void initPaint() {

textPaint.setAntiAlias(true);

textPaint.setTextAlign(Paint.Align.CENTER);

}

/**

* Vertical alignment of text within the drawable (Horizontally it is always aligned to center

*/

public VerticalAlignment getVerticalAlignment() {

return verticalAlignment;

}

/**

* Vertical alignment of text within the drawable (Horizontally it is always aligned to center

*/

public void setVerticalAlignment(VerticalAlignment verticalAlignment) {

if (this.verticalAlignment != verticalAlignment) {

this.verticalAlignment = verticalAlignment;

invalidateSelf();

}

}

/**

* Displayed text

*/

public String getText() {

return text;

}

/**

* Displayed text

*/

public void setText(String text) {

if (this.text == null || !this.text.equals(text)) {

this.text = text;

invalidateSelf();

}

}

/**

* The color of text

*/

public ColorStateList getColor() {

return color;

}

/**

* The color of text

*/

public void setColor(ColorStateList colorStateList) {

if (this.color == null || !this.color.equals(colorStateList)) {

this.color = colorStateList;

invalidateSelf();

}

}

/**

* The color of text

*/

public void setColor(int color) {

setColor(ColorStateList.valueOf(color));

}

/**

* Text size

*/

public void setTextSize(float size) {

if (this.textPaint.getTextSize() != size) {

this.textPaint.setTextSize(size);

measureSize();

invalidateSelf();

}

}

/**

* Text size

*/

public void setTextSize(int unit,float size,Context context) {

setTextSize(TypedValue.applyDimension(unit,size,context.getResources().getDisplayMetrics()));

}

/**

* This method is called by default when any property that may have some influence on the size

* of drawable This method should use measuredWidth and measuredHeight properties to store the

* measured walues By default the measuredWIdth and measuredHeight are set to iWidth and iHeight

* (size of text) by this method.

*/

protected void measureSize() {

ascent = -textPaint.ascent();

iWidth = (int) (0.5f + textPaint.measureText(text));

iHeight = (int) (0.5f + textPaint.descent() + ascent);

measuredWidth = iWidth;

measuredHeight = iHeight;

}

public float getTextSize() {

return textPaint.getTextSize();

}

@Override

protected boolean onStateChange(int[] state) {

int clr = color != null ? color.getColorForState(state,0) : 0;

if (textPaint.getColor() != clr) {

textPaint.setColor(clr);

return true;

} else {

return false;

}

}

public Typeface getTypeface() {

return textPaint.getTypeface();

}

public void setTypeface(Typeface typeface) {

if (!textPaint.getTypeface().equals(typeface)) {

textPaint.setTypeface(typeface);

invalidateSelf();

}

}

/**

* The method is called before the text is drawn. This method can be overridden to draw some background (by default this method does nothing).

* @param canvas The canvas where to draw.

* @param bounds The bounds of the drawable.

*/

protected void drawBefore(Canvas canvas,Rect bounds) {

}

/**

* The method is called after the text is drawn. This method can be overriden to draw some more graphics over the text (by default this method does nothing).

* @param canvas The canvas where to draw.

* @param bounds The bound of the drawable.

*/

protected void drawAfter(Canvas canvas,Rect bounds) {

}

@Override

public void draw(Canvas canvas) {

if (text == null || text.isEmpty()) {

return;

}

final Rect bounds = getBounds();

int stack = canvas.save();

canvas.translate(bounds.left,bounds.top);

drawBefore(canvas,bounds);

if (text != null && !text.isEmpty()) {

final float x = bounds.width() >= iWidth ? bounds.centerX() : iWidth * 0.5f;

float y = 0;

switch (verticalAlignment) {

case BASELINE:

y = (bounds.height() - iHeight) * 0.5f + ascent;

break;

case TOP:

y = bounds.height();

break;

case BOTTOM:

y = bounds.height();

break;

}

canvas.drawText(text,x,y,textPaint);

}

drawAfter(canvas,bounds);

canvas.restoreToCount(stack);

}

@Override

public void setAlpha(int alpha) {

if (textPaint.getAlpha() != alpha) {

textPaint.setAlpha(alpha);

invalidateSelf();

}

}

@Override

public void setColorFilter(ColorFilter cf) {

if (textPaint.getColorFilter() == null || !textPaint.getColorFilter().equals(cf)) {

textPaint.setColorFilter(cf);

invalidateSelf();

}

}

@Override

public int getOpacity() {

return PixelFormat.TRANSLUCENT;

}

public enum VerticalAlignment {

TOP,BOTTOM,BASELINE

}

以及如何使用它:

fab.setImageDrawable(new TextDrawable(fab.getContext(),"FAB",ColorStateList.valueOf(Color.BLACK),32.f,VerticalAlignment.BASELINE));

(fab是FloatingActionButton)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值