作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 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 边界被剪裁了:
我知道这是因为我的 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/
我是一名优秀的程序员,十分优秀!