Vertical (rotated) label in Android

后端 未结 10 998
礼貌的吻别
礼貌的吻别 2020-11-22 08:04

I need 2 ways of showing vertical label in Android:

  1. Horizontal label turned 90 degrees counterclockwise (letters on the side)
  2. Horizontal label with l
10条回答
  •  不思量自难忘°
    2020-11-22 08:32

    I implemented this for my ChartDroid project. Create VerticalLabelView.java:

    public class VerticalLabelView extends View {
        private TextPaint mTextPaint;
        private String mText;
        private int mAscent;
        private Rect text_bounds = new Rect();
    
        final static int DEFAULT_TEXT_SIZE = 15;
    
        public VerticalLabelView(Context context) {
            super(context);
            initLabelView();
        }
    
        public VerticalLabelView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initLabelView();
    
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.VerticalLabelView);
    
            CharSequence s = a.getString(R.styleable.VerticalLabelView_text);
            if (s != null) setText(s.toString());
    
            setTextColor(a.getColor(R.styleable.VerticalLabelView_textColor, 0xFF000000));
    
            int textSize = a.getDimensionPixelOffset(R.styleable.VerticalLabelView_textSize, 0);
            if (textSize > 0) setTextSize(textSize);
    
            a.recycle();
        }
    
        private final void initLabelView() {
            mTextPaint = new TextPaint();
            mTextPaint.setAntiAlias(true);
            mTextPaint.setTextSize(DEFAULT_TEXT_SIZE);
            mTextPaint.setColor(0xFF000000);
            mTextPaint.setTextAlign(Align.CENTER);
            setPadding(3, 3, 3, 3);
        }
    
        public void setText(String text) {
            mText = text;
            requestLayout();
            invalidate();
        }
    
        public void setTextSize(int size) {
            mTextPaint.setTextSize(size);
            requestLayout();
            invalidate();
        }
    
        public void setTextColor(int color) {
            mTextPaint.setColor(color);
            invalidate();
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    
            mTextPaint.getTextBounds(mText, 0, mText.length(), text_bounds);
            setMeasuredDimension(
                    measureWidth(widthMeasureSpec),
                    measureHeight(heightMeasureSpec));
        }
    
        private int measureWidth(int measureSpec) {
            int result = 0;
            int specMode = MeasureSpec.getMode(measureSpec);
            int specSize = MeasureSpec.getSize(measureSpec);
    
            if (specMode == MeasureSpec.EXACTLY) {
                // We were told how big to be
                result = specSize;
            } else {
                // Measure the text
                result = text_bounds.height() + getPaddingLeft() + getPaddingRight();
    
                if (specMode == MeasureSpec.AT_MOST) {
                    // Respect AT_MOST value if that was what is called for by measureSpec
                    result = Math.min(result, specSize);
                }
            }
            return result;
        }
    
        private int measureHeight(int measureSpec) {
            int result = 0;
            int specMode = MeasureSpec.getMode(measureSpec);
            int specSize = MeasureSpec.getSize(measureSpec);
    
            mAscent = (int) mTextPaint.ascent();
            if (specMode == MeasureSpec.EXACTLY) {
                // We were told how big to be
                result = specSize;
            } else {
                // Measure the text
                result = text_bounds.width() + getPaddingTop() + getPaddingBottom();
    
                if (specMode == MeasureSpec.AT_MOST) {
                    // Respect AT_MOST value if that was what is called for by measureSpec
                    result = Math.min(result, specSize);
                }
            }
            return result;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            float text_horizontally_centered_origin_x = getPaddingLeft() + text_bounds.width()/2f;
            float text_horizontally_centered_origin_y = getPaddingTop() - mAscent;
    
            canvas.translate(text_horizontally_centered_origin_y, text_horizontally_centered_origin_x);
            canvas.rotate(-90);
            canvas.drawText(mText, 0, 0, mTextPaint);
        }
    }

    And in attrs.xml:

    
         
            
            
            
        
    
    

提交回复
热议问题