gpt4 book ai didi

android - 如何在不剪切边界的情况下旋转 TextView?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:07:07 25 4
gpt4 key购买 nike

我正在尝试使用 canvas.rotate() 旋转我的 TextView 子类:

canvas.save();

final int w = getWidth();
final int h = getHeight();

float px = w/2f;
float py = h/2f;
canvas.rotate(mAngle, px, py);

super.draw(canvas);

canvas.restore();

TextView 已旋转,但我的 View 边界被剪裁了:

illustration

我知道这是因为我的 View 大小 - 它在旋转期间没有改变,而它应该。但如果我在 onMeasure 中更改 width\height 问题将仍然存在 - 我正在使用 LayoutParams.WRAP_CONTENT,所以 TextView 只需更改它的大小根据 setMeasuredDimensions 中提供的值。

我该如何解决这个问题?

最佳答案

我认为这里的全部问题在于您使用的是 WRAP_CONTENT。当您这样做时, View 的剪辑矩形就是文本内容的大小。解决该问题的最简单方法是使用填充。像这样的东西,对我来说很好用:

<com.example.twistedtext.TwistedTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="30dp"
android:gravity="center"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
twistedtext:rotation="30.0f"
android:text="@string/hello_world" />

当然,如果您这样做,则必须为每个内容选择略有不同的填充。如果您不能这样做,请重写 onMeasure,这样它就可以完全执行 TextView 的 onMeasure 所做的事情,然后根据旋转的需要添加相应的填充。

稍后添加:实际上,弄清楚这一点很有趣。我有以下 onMeasure,效果很好:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int w = getMeasuredWidth();
int h = getMeasuredHeight();
w = (int) Math.round(w * cosA + h * sinA);
h = (int) Math.round(h * cosA + w * sinA);
setMeasuredDimension(w, h);
}

唯一剩下的问题是文本会根据旋转前的尺寸换行。你也必须解决这个问题......

sinA 和 cosA 是在设置 mAngle 时计算的。

关于android - 如何在不剪切边界的情况下旋转 TextView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14399835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com