如何在没有修剪其边界旋转的TextView?(How to rotate TextView with

2019-08-07 07:41发布

我想我的旋转子类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

我怎么解决这个问题?

Answer 1:

我认为这里的整个问题,就是你正在使用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被计算。



Answer 2:

好吧,如果你不能在当前视图教主旋转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);


Answer 3:

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

主要的想法是,我给予未被削减画布的孩子。



Answer 4:

你可以检查出https://github.com/grantland/android-autofittextview特别是其refitText()方法。

Rotationg你的TextView应毕竟导致onMeasure()方法,所有的魔法开始的调用。



文章来源: How to rotate TextView without clipping its bounds?