自定义TextView带货币符号

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;


import com.shangyi.schoolmall.R;
import com.shangyi.schoolmall.log.SyLog;
import com.shangyi.schoolmall.util.DPIUtil;


/**
 *
 * 价格自定义视图,必须定义视图宽度为定值或满屏
 * <pre>
 * 注意:使用PriceText_title_textsize和PriceText_num_textsize自定义属性时,应同时设置textsize属性值,
 * textsize属性值大小为PriceText_title_textsize和PriceText_num_textsize其中的最大值
 * (不设置易造成高度改变,滑动到时高度计算错误)
 * </pre>
 *
 * @author llp
 *
 * 2015年9月5日 下午5:17:46
 */
public class PriceTextView extends TextView {
public static String TAG = PriceTextView.class.getSimpleName();

private static final int MIN_NUM_TEXT_SIZE = 10; // SP
private Paint mPaint = null;
/**
 * 金额默认字体大小
 */
private float mAmountNumTsDef;
/**
 * 金额最终确定的合适的字体大小
 */
private float mAmountNumTsActual;
/**
 * 说明文字默认字体大小
 */
private float mAmountTitleTsDef;
/**
 * 说明文字最终确定的合适的字体大小
 */
private float mAmountTitleTsActual;
/**
 * 是否居左显示(false 为居右显示)
 */
private boolean mIsLeft = false;
/**
 * 金额前面的说明文字
 */
private String mAmountTitleStr;
/**
 * 金额钱币符号
 */
private String mCurrencySymbolStr;
/**
 * 说明文字字体颜色
 */
private int mAmountTitleColor;
/**
 * 金额字体颜色
 */
private int mAmountNumColor;


public PriceTextView(Context paramContext, AttributeSet paramAttributeSet) {
super(paramContext, paramAttributeSet);
this.mPaint = new Paint();
TypedArray typeArray= paramContext.obtainStyledAttributes(paramAttributeSet, R.styleable.PriceText);
this.mIsLeft = typeArray.getBoolean(R.styleable.PriceText_is_left, false);
this.mAmountTitleColor = typeArray.getColor(R.styleable.PriceText_title_color, paramContext.getResources().getColor(R.color.Black));
this.mAmountNumColor = typeArray.getColor(R.styleable.PriceText_num_color, paramContext.getResources().getColor(R.color.red));
this.mAmountTitleTsDef = typeArray.getDimension(R.styleable.PriceText_title_textsize, 40);
this.mAmountNumTsDef = typeArray.getDimension(R.styleable.PriceText_num_textsize, 40);
mAmountTitleStr = typeArray.getString(R.styleable.PriceText_title_text);//资源文件货币符号替换  ¥
if(null == mAmountTitleStr){
mAmountTitleStr = "";
}
typeArray.recycle();
mCurrencySymbolStr = paramContext.getResources().getString(R.string.shopping_cart_currency_symbol);
}


private void computeTextSize(float width, String textStr, float numTextSize, float titleTextSize) {
while (true) {
//Log.e(TAG, " computeTextSize ... numTextSize: " + numTextSize + "; titleTextSize: " + titleTextSize);
// 计算总额数字符串真实长度
mPaint.setTextSize(numTextSize);
float amountNumWidth = this.mPaint.measureText(textStr);
// 计算“总额:”字符串真实长度(字体大小为总额数字体大小-2)
mPaint.setTextSize(titleTextSize);
float amountTitleWidth = mPaint.measureText(mAmountTitleStr);

if (numTextSize <= DPIUtil.sp2px(getContext(), MIN_NUM_TEXT_SIZE) || width - 1.2F * (textStr.length() + mAmountTitleStr.length())  > amountNumWidth + amountTitleWidth){
mAmountNumTsActual = numTextSize;
mAmountTitleTsActual = titleTextSize;
SyLog.d(TAG, " title size: " + mAmountTitleTsActual  + " num size: " + mAmountNumTsActual + "\n" +
" title width: " + amountTitleWidth + " num width: " + amountNumWidth);
return;
}
numTextSize -= 1.0F;
titleTextSize -= 1.0F;
}

}


protected void onDraw(Canvas paramCanvas) {
// 拼凑货币符号+总额数,如¥1000
String totalNumStr = mCurrencySymbolStr + getText().toString();
// 计算字体大小
computeTextSize(getWidth(), totalNumStr, this.mAmountNumTsDef, this.mAmountTitleTsDef);
// 将字体大小由px转换为sp
//SyLog.d(TAG, "title size: " + mAmountTitleTsActual  + " num size: " + mAmountNumTsActual + " def size: " + this.mAmountNumTsDef);


// 计算总额数title长度
getPaint().setTextSize(mAmountTitleTsActual);
float amountTitleStrWidth = getPaint().measureText(mAmountTitleStr);
// 计算总额数数值长度
getPaint().setTextSize(mAmountNumTsActual);
float totalNumStrWith = getPaint().measureText(totalNumStr);

//SyLog.d(TAG, "final title size: " + mAmountTitleTsActual  + " final num size: " + mAmountNumTsActual + "\n" +
//" final title width: " + amountTitleStrWidth + " final num width: " + totalNumStrWith);

// 设置总额数title字体大小和颜色
getPaint().setTextSize(mAmountTitleTsActual);
getPaint().setColor(mAmountTitleColor);
if(this.mIsLeft){
paramCanvas.drawText(mAmountTitleStr, 0.0F, getHeight() / 2 + this.mAmountTitleTsActual / 3.0F, getPaint());
}else{
paramCanvas.drawText(mAmountTitleStr, getWidth() - amountTitleStrWidth - totalNumStrWith, getHeight() / 2 + this.mAmountTitleTsActual / 3.0F, getPaint());
}
// 设置总额数数值字体大小和颜色
getPaint().setTextSize(mAmountNumTsActual);
getPaint().setColor(mAmountNumColor);
if (this.mIsLeft) {
paramCanvas.drawText(totalNumStr, 0.0F + amountTitleStrWidth, getHeight() / 2 + this.mAmountNumTsActual / 3.0F, getPaint());
}else{
paramCanvas.drawText(totalNumStr, getWidth() - totalNumStrWith, getHeight() / 2 + this.mAmountNumTsActual / 3.0F, getPaint());
}
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

}

-------------------------------------------------------------2016年12月3日09:36:49------------------------------------------------------------------------------------

看到有人找我要资源文件,我去找了一下....


<declare-styleable name="PriceText">
    <attr name="is_left" format="boolean" />
    <attr name="title_color" format="reference|color" />
    <attr name="num_color" format="reference|color" />
    <attr name="title_textsize" format="reference|dimension" />
    <attr name="num_textsize" format="reference|dimension" />
    <attr name="title_text" format="reference|string" />
</declare-styleable>
string.xml文件资源...

<string name="shopping_cart_currency_symbol">¥</string>

都已经这样了,如果还要下载源码,那就下载吧

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Android自定义TextView中显示全部内容,可以使用以下两种方法: 1. 使用setEllipsize()方法 通过设置setEllipsize()方法,可以在TextView的末尾添加省略号,从而指示文本被截断。你可以使用以下代码来实现: ``` yourTextView.setEllipsize(TextUtils.TruncateAt.END); yourTextView.setSingleLine(true); ``` 上述代码将设置TextView只显示一行并在末尾添加省略号。 2. 自定义TextView 你可以从TextView类继承一个新类,并覆盖onMeasure()方法以测量控件的高度和宽度。 你可以使用以下代码实现: ``` public class CustomTextView extends TextView { public CustomTextView(Context context) { super(context); } public CustomTextView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //获取TextView的内容 CharSequence text = getText(); if (text != null) { //测量TextView的高度 int width = getMeasuredWidth(); int height = getMeasuredHeight(); int lineCount = getLineCount(); int lineHeight = getLineHeight(); int totalHeight = lineCount * lineHeight; if (totalHeight > height) { setMeasuredDimension(width, totalHeight); } } } } ``` 上述代码将测量TextView的高度,如果文本的高度超出了TextView的高度,则调整TextView的高度以适应文本。然后你可以使用此自定义TextView来显示你的文本。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值