在 Android 中旋转视图

我有一个按钮,我想把一个45度的角度。出于某种原因,我不能让这个工作。

有人能提供完成这项工作的代码吗?

134153 次浏览

扩展 TextView类并重写 onDraw()方法。确保父视图足够大,可以处理旋转按钮而不需要剪切它。

@Override
protected void onDraw(Canvas canvas) {
canvas.save();
canvas.rotate(45,<appropriate x pivot value>,<appropriate y pivot value>);
super.onDraw(canvas);
canvas.restore();


}

您可以创建一个动画并将其应用到您的按钮视图中,例如:

    // Locate view
ImageView diskView = (ImageView) findViewById(R.id.imageView3);


// Create an animation instance
Animation an = new RotateAnimation(0.0f, 360.0f, pivotX, pivotY);


// Set the animation's parameters
an.setDuration(10000);               // duration in ms
an.setRepeatCount(0);                // -1 = infinite repeated
an.setRepeatMode(Animation.REVERSE); // reverses each repeat
an.setFillAfter(true);               // keep rotation after animation


// Aply animation to image view
diskView.setAnimation(an);

这个回答对视图来说是正确的,但是如果你想画一个旋转的矩形或者文本,你可以在 onDraw (或者 onDispatchDraw)回调中为你的视图做以下操作:

(注意 θ 是所需旋转的 x 轴的角度,pivot 是表示我们想要矩形绕其旋转的点的 Point,卧式矩形是矩形“旋转之前”的位置)

canvas.save();
canvas.rotate(theta, pivot.x, pivot.y);
canvas.drawRect(horizontalRect, paint);
canvas.restore();

API 11向所有视图添加了 Set旋转()方法。

我只是在代码中使用了一个简单的代码行,它就可以工作了:

myCusstomView.setRotation(45);

希望对你有用。

加入@Rudi 和@Pete 的回答。我已经创建了一个 RotateAnimation,它可以在旋转之后保持按钮的功能。

Set旋转()方法保留按钮功能。

代码示例:

Animation an = new RotateAnimation(0.0f, 180.0f, mainLayout.getWidth()/2, mainLayout.getHeight()/2);


an.setDuration(1000);
an.setRepeatCount(0);
an.setFillAfter(false);              // DO NOT keep rotation after animation
an.setFillEnabled(true);             // Make smooth ending of Animation
an.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {}


@Override
public void onAnimationRepeat(Animation animation) {}


@Override
public void onAnimationEnd(Animation animation) {
mainLayout.setRotation(180.0f);      // Make instant rotation when Animation is finished
}
});


mainLayout.startAnimation(an);

MainLayout 是一个(LinearLayout)字段

应用旋转动画(没有持续时间,因此没有动画效果)是一个比调用 View.set旋转()或覆盖 View.onDraw 方法更简单的解决方案。

// substitude deltaDegrees for whatever you want
RotateAnimation rotate = new RotateAnimation(0f, deltaDegrees,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);


// prevents View from restoring to original direction.
rotate.setFillAfter(true);


someButton.startAnimation(rotate);

使用 rotate()的旋转视图不会影响视图的测量大小。结果,旋转视图被剪切或不适合父布局。不过,这个库可以修复它:

Https://github.com/rongi/rotate-layout

enter image description here

XML 中的一行


<View
android:rotation="45"
... />

很简单, 用爪哇语

your_component.setRotation(15);

或者

your_component.setRotation(295.18f);

在 XML 中

<Button android:rotation="15" />
fun rotateArrow(view: View): Boolean {
return if (view.rotation == 0F) {
view.animate().setDuration(200).rotation(180F)
true
} else {
view.animate().setDuration(200).rotation(0F)
false
}
}

如前所述,自 API 11以来使用 rotation最简单的方法是:

android:rotation="90"    // in XML layout


view.rotation = 90f      // programatically

您还可以更改旋转的枢轴,默认情况下,枢轴设置为视图的中心。这需要通过编程方式进行更改:

// top left
view.pivotX = 0f
view.pivotY = 0f


// bottom right
view.pivotX = width.toFloat()
view.pivotY = height.toFloat()


...

在活动的 onCreate()或片段的 onCreateView(...)宽度和高度等于0,因为视图还没有测量。只需使用 安卓 KTX中的 doOnPreDraw扩展名即可访问它,即:

view.apply {
doOnPreDraw {
pivotX = width.toFloat()
pivotY = height.toFloat()
}
}

如果你想用动画动态制作:

view.animate()
.rotation(180)
.start();

就是这样