我想我的旋转子类TextView
使用canvas.rotate()
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的旋转,但是我的观点的界限剪辑:
我明白,这是因为我的视图的大小 - 而它应该是不旋转的过程中发生变化。 但是,如果我会改的宽度\高度onMeasure
问题始终存在-我使用LayoutParams.WRAP_CONTENT
,这样TextView
根据提供的值只是改变它的大小setMeasuredDimensions
。
我怎么解决这个问题?
我认为这里的整个问题,就是你正在使用WRAP_CONTENT。 该视图的剪辑矩形,当你这样做,是文本内容的大小。 要解决这个问题,最简单的方法是使用填充。 这样的事情,对我来说工作正常:
<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被计算。
好吧,如果你不能在当前视图教主旋转TextView的,你应该在另外一个制作动画。
创建您的TextView的位图represantation。 使用持有人的情况类似位ImageView的。 在ImageView的连接到另一布局是在顶部,在那里它不会被裁剪。 隐藏你的TextView。 在ImageView的运行动画。 当动画完成后,更新的TextView表示,TextView的显示和删除ImageView的。
我无法找到你想要什么确切的代码示例,但看看这一个 。 该interecting地方是:
mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(YOUR_VIEW_WITH_ANIMATION, mWindowParams);
在由G.布雷克每棵提供第一次看的解决方案是一个良好的开端,但还有很多问题upcome。
为了克服问题存在另一种方式。 这是很简单的,但一般不应使用(因为我刚刚删除unneccesary我从原生Android源的东西)。 接管的具体绘制控制View
可以覆盖drawChild
方法,它的父(是的,你需要自己的子类ViewGroup
或更具体的东西喜欢FrameLayout
)。 这里是我的解决方案的一个例子:
@Override
protected boolean drawChild(Canvas canvas, View child, long time) {
//TextBaloon - is view that I'm trying to rotate
if(!(child instanceof TextBaloon)) {
return super.drawChild(canvas, child, time);
}
final int width = child.getWidth();
final int height = child.getHeight();
final int left = child.getLeft();
final int top = child.getTop();
final int right = left + width;
final int bottom = top + height;
int restoreTo = canvas.save();
canvas.translate(left, top);
invalidate(left - width, top - height, right + width, bottom + height);
child.draw(canvas);
canvas.restoreToCount(restoreTo);
return true;
}
主要的想法是,我给予未被削减画布的孩子。
你可以检查出https://github.com/grantland/android-autofittextview特别是其refitText()方法。
Rotationg你的TextView应毕竟导致onMeasure()方法,所有的魔法开始的调用。