我自定义了一个View,宽高设为wrap_content后,静态改变文本大小时,自定义view的宽高会随着文本大小的变化而改变,但是动态设置的时候,文本内容变了

Cy86183570 2017-12-20 02:45:33
TextView宽高设置为wrap_content后,动态改变文本内容的大小时,textView的宽高也动态的改变了,这是怎么实现的?我自定义了一个View,宽高设为wrap_content后,静态改变文本大小时,自定义view的宽高会随着文本大小的变化而改变,但是动态设置的时候,文本内容变了,但是自定义view的宽高没发生变化,知道小键盘收起或弹出时,自定义view的宽高才发生变化
<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();
}
});

//commit方法具体内容:
 public void commit(){
initPaint();
invalidate();
}


XML内容:
<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"
/>


出现的情况:
按下按钮后:
小键盘收起后:
具体情况就是这样子,跪求大神解答
...全文
635 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cy86183570 2017-12-22
  • 打赏
  • 举报
回复
引用 10 楼 jklwan 的回复:
说实话,不如写个Layout包含俩textview,比你写的自定义控件性能和效果要强不少。
是是是,我特地用的继承View,
jklwan 2017-12-22
  • 打赏
  • 举报
回复
说实话,不如写个Layout包含俩textview,比你写的自定义控件性能和效果要强不少。
Cy86183570 2017-12-22
  • 打赏
  • 举报
回复
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();
    }
}
Cy86183570 2017-12-22
  • 打赏
  • 举报
回复
引用 6 楼 xj396282771 的回复:
[quote=引用 4 楼 Cy86183570 的回复:] 我自定义View的源码要全部展示出来,还是展示多少
全部嘛,我想试下[/quote] 嗯,马上分享,可别嫌弃我写的代码咯哦。
Cy86183570 2017-12-22
  • 打赏
  • 举报
回复
引用 5 楼 ink_s 的回复:
setMeasuredDimension(measuredWidth, measuredHeight); 刷新宽高,不用这个方法,宽高是不变的
这个方法我是用了的,在onMeasure方法中,可问题时在动态修改文本内容时,onMeausre方法没有被调用,而是直接通过重绘调用了onDraw方法,所以只是文本发生了变化,而宽高没变
Jing丶無雙 2017-12-22
  • 打赏
  • 举报
回复


这些资源又咋写的
Jing丶無雙 2017-12-21
  • 打赏
  • 举报
回复
引用 4 楼 Cy86183570 的回复:
我自定义View的源码要全部展示出来,还是展示多少
全部嘛,我想试下
ink_s 2017-12-21
  • 打赏
  • 举报
回复
setMeasuredDimension(measuredWidth, measuredHeight); 刷新宽高,不用这个方法,宽高是不变的
Cy86183570 2017-12-21
  • 打赏
  • 举报
回复
引用 2 楼 xj396282771 的回复:
MergeTextView你这个怎么写的??
我自定义View的源码要全部展示出来,还是展示多少
Cy86183570 2017-12-21
  • 打赏
  • 举报
回复
引用 1 楼 moonFY 的回复:
debug 看看是否重绘了View
重绘了,但是view的宽高没有测量
Jing丶無雙 2017-12-20
  • 打赏
  • 举报
回复
MergeTextView你这个怎么写的??
moonFY 2017-12-20
  • 打赏
  • 举报
回复
debug 看看是否重绘了View

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧