80,351
社区成员
发帖
与我相关
我的任务
分享
<div class="blockcode"><blockquote> binding.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//mergeTxt指的是我自定义view的id
LoginActivity.this.binding.mergeTxt.setLeftTxt("2000");
LoginActivity.this.binding.mergeTxt.setLeftTxtSize(35);
LoginActivity.this.binding.mergeTxt.setRightTxt("km");
LoginActivity.this.binding.mergeTxt.setRightTxtSize(10);
LoginActivity.this.binding.mergeTxt.setSpace4LAndR(5);
//这个方法是我用来重绘的
LoginActivity.this.binding.mergeTxt.commit();
}
});
public void commit(){
initPaint();
invalidate();
}
<com.example.admin.usedcar.View.MergeTextView.MergeTextView
android:id="@+id/mergeTxt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="0dp"
app:leftTxt="1000"
app:leftTxtSize="30dp"
app:rightTxt="%"
app:rightTxtSize="20dp"
app:gravity="center"
/>
public class MergeTextView extends View {
private static final String TAG = "MergeTextView";
private DisplayUtils displayUtils = new DisplayUtils();
private Paint leftTxtPaint;
private String leftTxt = "100";
private int leftTxtSize;
private int leftTxtColor;
private Paint rightTxtPaint;
private String rightTxt = "%";
private int rightTxtSize;
public String getLeftTxt() {
return leftTxt;
}
public void setLeftTxt(String leftTxt) {
this.leftTxt = leftTxt;
commit();
}
public int getLeftTxtSize() {
return leftTxtSize;
}
public void setLeftTxtSize(int leftTxtSize) {
this.leftTxtSize = leftTxtSize;
commit();
}
public int getLeftTxtColor() {
return leftTxtColor;
}
public void setLeftTxtColor(int leftTxtColor) {
this.leftTxtColor = leftTxtColor;
commit();
}
public String getRightTxt() {
return rightTxt;
}
public void setRightTxt(String rightTxt) {
this.rightTxt = rightTxt;
commit();
}
public int getRightTxtSize() {
return rightTxtSize;
}
public void setRightTxtSize(int rightTxtSize) {
this.rightTxtSize = rightTxtSize;
commit();
}
public int getRightTxtColor() {
return rightTxtColor;
}
public void setRightTxtColor(int rightTxtColor) {
this.rightTxtColor = rightTxtColor;
commit();
}
public float getSpace4LAndR() {
return space4LAndR;
}
public void setSpace4LAndR(float space4LAndR) {
this.space4LAndR = displayUtils.dip2px(space4LAndR,getContext());
commit();
}
public int getGravity() {
return gravity;
}
public void setGravity(int gravity) {
this.gravity = gravity;
commit();
}
private int rightTxtColor;
private float measureLeftText;
private float measureRightText;
private float measuredHeight;
private float measuredWidth;
private float space4LAndR;
private float leftStartX;
private float leftStartY;
private float rightStartX;
private float rightStartY;
private int gravity;
private final int CENTER = 0;
private final int LEFT = 1;
private final int RIGHT = 2;
public MergeTextView(Context context) {
this(context,null);
}
public MergeTextView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public MergeTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initAttrs(context,attrs);
initPaint();
}
private void initAttrs(Context context, AttributeSet attrs) {
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MergeTextView);
leftTxt = ta.getString(R.styleable.MergeTextView_leftTxt);
leftTxtColor = ta.getColor(R.styleable.MergeTextView_leftTxtColor, Color.BLACK);
leftTxtSize = ta.getDimensionPixelSize(R.styleable.MergeTextView_leftTxtSize,displayUtils.dip2px(20.0f,context));
rightTxt = ta.getString(R.styleable.MergeTextView_rightTxt);
rightTxtColor = ta.getColor(R.styleable.MergeTextView_rightTxtColor, Color.RED);
rightTxtSize = ta.getDimensionPixelSize(R.styleable.MergeTextView_rightTxtSize,displayUtils.dip2px(8.0f,context));
space4LAndR = ta.getDimensionPixelOffset(R.styleable.MergeTextView_space4LAndR,displayUtils.dip2px(2.0f,context));
gravity = ta.getInt(R.styleable.MergeTextView_gravity,CENTER);
ta.recycle();
}
private void initPaint() {
//左边字
if(leftTxtPaint==null) leftTxtPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
leftTxtPaint.setStyle(Paint.Style.FILL);
leftTxtPaint.setTextSize(displayUtils.dip2px(leftTxtSize,getContext()));
leftTxtPaint.setColor(leftTxtColor);
if(leftTxt!=null){
measureLeftText = leftTxtPaint.measureText(leftTxt);
}else {
measureLeftText = 0;
}
//右边字
if(rightTxtPaint==null) rightTxtPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
rightTxtPaint.setStyle(Paint.Style.FILL);
rightTxtPaint.setTextSize(displayUtils.dip2px(rightTxtSize,getContext()));
rightTxtPaint.setColor(rightTxtColor);
if(rightTxt!=null){
measureRightText = rightTxtPaint.measureText(rightTxt);
}else {
measureRightText = 0;
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 获取宽-测量规则的模式和大小
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
// 获取高-测量规则的模式和大小
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
measuredWidth = measureLeftText+space4LAndR+measureRightText+getPaddingRight()+getPaddingLeft();
measuredHeight = leftTxtPaint.getTextSize()+getPaddingTop()+getPaddingBottom();
// 当布局参数设置为wrap_content时,设置默认值
if (getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT &&
getLayoutParams().height == ViewGroup.LayoutParams.WRAP_CONTENT) {
setMeasuredDimension((int)measuredWidth,(int)measuredHeight);
// 宽 / 高任意一个布局参数为= wrap_content时,都设置默认值
} else if (getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT) {
setMeasuredDimension((int)measuredWidth, heightSize);
measuredHeight = getMeasuredHeight();
} else if (getLayoutParams().height == ViewGroup.LayoutParams.WRAP_CONTENT) {
setMeasuredDimension(widthSize, (int)measuredHeight);
measuredWidth = getMeasuredWidth();
}else {
measuredHeight = getMeasuredHeight();
measuredWidth = getMeasuredWidth();
}
if(gravity==LEFT){
leftStartX = getPaddingLeft();
leftStartY = measuredHeight - getPaddingBottom()-leftTxtPaint.descent()-displayUtils.dip2px(2,getContext());
rightStartX = leftStartX+measureLeftText+space4LAndR;
rightStartY = leftStartY;
}else if(gravity==CENTER){
leftStartX = measuredWidth/2-(measureLeftText+space4LAndR+measureRightText)/2;
leftStartY = measuredHeight/2+leftTxtPaint.getTextSize()/2-displayUtils.dip2px(2,getContext());
// + Math.abs(leftTxtPaint.ascent()-leftTxtPaint.descent())/2;
rightStartX = leftStartX+measureLeftText+space4LAndR;
rightStartY = leftStartY;
}else if(gravity==RIGHT){
leftStartX = measuredWidth -getPaddingRight() - measureLeftText - measureRightText - space4LAndR;
leftStartY = measuredHeight-getPaddingBottom() - leftTxtPaint.descent()-displayUtils.dip2px(2,getContext());
rightStartX = leftStartX + measureLeftText + space4LAndR;
rightStartY = leftStartY;
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText(leftTxt,leftStartX,leftStartY,leftTxtPaint);
canvas.drawText(rightTxt,rightStartX,rightStartY,rightTxtPaint);
invalidate();
}
public void commit(){
initPaint();
invalidate();
}
}