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);
}
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>