【问题标题】:How to set text direction on Canvas如何在 Canvas 上设置文本方向
【发布时间】:2013-01-24 10:20:02
【问题描述】:

如何在 Canvas 上设置文本方向(旋转)。以垂直为例。

【问题讨论】:

    标签: android android-canvas android-view


    【解决方案1】:

    您可以使用rotate() 方法指定接下来要绘制的元素的旋转。

    附加说明:请务必阅读Canvas documentation 的其余部分,因为它有很多操作方法(假设您在某个阶段需要的不仅仅是旋转文本)

    【讨论】:

      【解决方案2】:

      这是一个简单的垂直文本实现和旋转。

      public class VerticalTextView extends TextView{
      final boolean topDown;
      
       public VerticalTextView(Context context, AttributeSet attrs){
        super(context, attrs);
        final int gravity = getGravity();
        if(Gravity.isVertical(gravity) && (gravity&Gravity.VERTICAL_GRAVITY_MASK) == Gravity.BOTTOM) {
           setGravity((gravity&Gravity.HORIZONTAL_GRAVITY_MASK) | Gravity.TOP);
           topDown = false;
        }else
           topDown = true;
      }
      
      @Override
      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        super.onMeasure(heightMeasureSpec, widthMeasureSpec);
        setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
      }
      
      @Override
      protected void onDraw(Canvas canvas){
        TextPaint textPaint = getPaint(); 
        textPaint.setColor(getCurrentTextColor());
        textPaint.drawableState = getDrawableState();
      
        canvas.save();
      
        if(topDown){
           canvas.translate(getWidth(), 0);
           canvas.rotate(90);
        }else {
           canvas.translate(0, getHeight());
           canvas.rotate(-90);
        }
      
      
        canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop());
      
        getLayout().draw(canvas);
        canvas.restore();
      }
      }
      

      默认情况下,旋转文本是从上到下。如果你设置了

      android:gravity="bottom" 
      

      然后从下往上绘制。

      【讨论】:

      • 对我来说这是一个非常复杂的例子,我之前在stackoverflow.com/questions/9262494/… 看到过。我不明白,虽然它在我的代码中不起作用,但现在并不重要。我已经添加了我的解决方案,它有效且非常简单。谢谢!
      【解决方案3】:

      最简单的方法是:

      @Override
      public void draw(Canvas canvas) {
          super.draw(canvas);
          canvas.rotate(90, x, y);
          canvas.drawText("text", x, y, textPaint);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-05
        • 2014-12-10
        • 1970-01-01
        • 2019-05-26
        • 1970-01-01
        • 2011-08-12
        • 1970-01-01
        相关资源
        最近更新 更多