2013-05-20 2 views
0

Я хотел бы создать квадрат в зависимости от длины текста и возможности его поворота. Я расширил текст и изменил onMeasure, но когда я вращаю его, текст рисуется в верхней части квадрата. Когда он начинает вращаться, текст не вращается вокруг собственной средней точки.Android rotate TextView с собственным расширенным классом TextView

На изображении ниже показан результат текущей ситуации в красном и желаемая ситуация в зеленом цвете. Желтая точка - опорная точка.

Text image

Большое спасибо за вашу помощь!

import android.content.Context; 
import android.graphics.Canvas; 
import android.util.AttributeSet; 
import android.widget.TextView; 

public class MyTextView extends TextView { 

private int angle = 0; 

public MyTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec,heightMeasureSpec); 
    setMeasuredDimension(getMeasuredWidth(),getMeasuredWidth()); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.save(); 
    canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop()); 
    canvas.rotate(angle, canvas.getWidth()/2f, canvas.getHeight()/2f); 
    getLayout().draw(canvas); 
    canvas.restore(); 
} 

public void setAngle(int textAngle) { 
    angle = textAngle; 
} 
} 
+0

Вы пытались установить гравитацию? –

ответ

2

Похоже, что есть две проблемы.

Одна гравитация не является центром, поэтому, когда она поворачивается, она не будет там, где вы ее ожидаете.

Другая проблема заключается в том, что вы хотите, чтобы она вращалась вокруг размера вида, а не размера холста. Смотри ниже.

Обратите внимание, что вам, возможно, придется немного подкорректировать, поскольку я не учитывал заполнение.

import android.content.Context; 
import android.graphics.Canvas; 
import android.util.AttributeSet; 
import android.view.Gravity; 
import android.widget.TextView; 

public class MyTextView extends TextView { 

    private int angle = 75; 

    public MyTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.setGravity(Gravity.CENTER); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.save(); 
     canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop()); 
     canvas.rotate(angle, this.getWidth()/2f, this.getHeight()/2f); 
     super.onDraw(canvas); 
     canvas.restore(); 
    } 

    public void setAngle(int textAngle) { 
     angle = textAngle; 
    } 
} 
+0

Привет, Джеймс, спасибо за вашу помощь! Я на один шаг ближе, но единственное, что еще не работает, - это гравитация. Возможно, это потому, что я изменил onMeasure? Вы это знаете? – patrick

+1

Можете ли вы опубликовать еще одну картину, показывающую, что происходит? Возможно, больше кода? –

+0

Я сделал это проще, и теперь он работает: я изменил onDraw на просто: canvas.rotate (angle, canvas.getWidth()/2f, canvas.getHeight()/2f); super.onDraw (холст); Теперь это работает. Спасибо за вашу помощь! – patrick

Смежные вопросы