【发布时间】:2010-12-28 04:58:39
【问题描述】:
我有一个按钮,我想以 45 度角放置。出于某种原因,我无法让它工作。
有人可以提供代码来完成这个吗?
【问题讨论】:
-
一个简单的解决方案,@Michale 的回答就像魅力一样 :) XML 中的一行
-
你是对的@Muahmmad,但它只有在你想从 xml 中执行时才会有所帮助,但如果我们想像单击按钮那样动态地执行它,那么它将不起作用..
我有一个按钮,我想以 45 度角放置。出于某种原因,我无法让它工作。
有人可以提供代码来完成这个吗?
【问题讨论】:
API 11 为所有视图添加了 setRotation() 方法。
【讨论】:
您可以创建一个动画并将其应用于您的按钮视图。例如:
// 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);
【讨论】:
扩展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();
}
【讨论】:
我只是在我的代码中使用了简单的一行,它可以工作:
myCusstomView.setRotation(45);
希望它对你有用。
【讨论】:
XML 中的一行
<View
android:rotation="45"
... />
【讨论】:
应用旋转动画(没有持续时间,因此没有动画效果)是比调用 View.setRotation() 或覆盖 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() 旋转视图不会影响视图的测量大小。结果,旋转的视图被剪裁或不适合父布局。不过这个库修复了它:
【讨论】:
加入@Rudi 和@Pete 的答案。我创建了一个 RotateAnimation,它在旋转后也保持按钮功能。
setRotation() 方法保留按钮功能。
代码示例:
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)字段
【讨论】:
如前所述,自 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()
...
在 Activity 的 onCreate() 或 Fragment 的 onCreateView(...) 中,宽度和高度等于 0,因为尚未测量视图。您只需使用来自Android KTX 的doOnPreDraw 扩展名即可访问它,即:
view.apply {
doOnPreDraw {
pivotX = width.toFloat()
pivotY = height.toFloat()
}
}
【讨论】:
@Ichorus 的回答对于视图是正确的,但是如果你想绘制旋转的矩形或文本,你可以在你的 onDraw(或 onDispatchDraw)回调中为你的视图执行以下操作:
(请注意,theta 是与所需旋转的 x 轴的角度,pivot 是表示我们希望矩形围绕其旋转的点的点,horizontalRect 是矩形“在”旋转之前的位置)
canvas.save();
canvas.rotate(theta, pivot.x, pivot.y);
canvas.drawRect(horizontalRect, paint);
canvas.restore();
【讨论】:
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
}
}
【讨论】:
如果您希望通过动画使其动态化:
view.animate()
.rotation(180)
.start();
就是这样
【讨论】:
这很简单, 在Java中
your_component.setRotation(15);
或
your_component.setRotation(295.18f);
在 XML 中
<Button android:rotation="15" />
【讨论】: