关于上一篇《android中自定义view---实现竖直方向的文字功能,文字方向朝上》的一个bug引起的思考

上一篇中的效果图片如下所示:

关于上一篇《android中自定义view---实现竖直方向的文字功能,文字方向朝上》的一个bug引起的思考_第1张图片

起初没有注意下部的最后一个字母"N"的位置,认真观察后发现,N的位置总是不能够达到最低端(padding为0)。这是为什么呢?

我又看了一遍onDraw函数的执行方式,发现问题所在:

 @Override  
    protected void onDraw(Canvas canvas) {  
        super.onDraw(canvas);  

        if(mTextLength == 0){
            return;
        }
        
        int height = getMeasuredHeight();
        int width = getMeasuredWidth();
        int paddingTop = getPaddingTop();
        int paddingBottom = getPaddingBottom();
        int paddingLeft = getPaddingLeft();
        int paddingRight = getPaddingRight();

        int x = paddingLeft + (width - paddingLeft - paddingRight)/2;
        float y = 0;
        //这里应该改成float,否则的话会造成精度的丢失
        float cellHeight = (float)(height - paddingTop - paddingBottom)/ (float)mTextLength;

        if(coordinates == null || coordinates.length != mTextLength){
            coordinates = new float[mTextLength + 1];
        }
        coordinates[0] = 0;
        for(int i = 0; i < mTextLength; i++){
            y = paddingTop + i * cellHeight + cellHeight/2;
            coordinates[i + 1] = y + cellHeight/2;
            if(currPickedCharIndex != i){
                canvas.drawText(mText, i, i + 1, x, y, mTextPaint);
            }else{
                canvas.drawText(mText, i, i + 1, x, y, mTextPaintPicked);
            }
        }
        coordinates[mTextLength] = height;
    }

由于在计算cellHeight时使用的是int类型的除法,也就是在相除的时候就将精度丢失了,如果丢失的是10%,那么27个字符就丢失210%,也就是2*cellHeight的高度。

将其更改为float后,问题得到解决,效果如下:

关于上一篇《android中自定义view---实现竖直方向的文字功能,文字方向朝上》的一个bug引起的思考_第2张图片

你可能感兴趣的:(关于上一篇《android中自定义view---实现竖直方向的文字功能,文字方向朝上》的一个bug引起的思考)