Android使用自己的扩展TextView类旋转TextView

时间:2013-05-20 20:48:06

标签: android rotation textview

我想根据文本的长度创建一个正方形,并能够旋转它。我已经扩展了textview并更改了onMeasure,但是当我旋转它时,文本会在方块的上半部分绘制。当它开始旋转时,文本不会围绕它自己的中间点旋转。

下图显示红色当前情况的结果和绿色的所需情况。黄点是枢轴点。

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;
}
}

1 个答案:

答案 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;
    }
}