我有一个按钮,我想放在45度角。出于某种原因,我不能让这个工作。
有人可以提供完成此操作的代码吗?
答案 0 :(得分:65)
API 11为所有视图添加了setRotation()方法。
答案 1 :(得分:57)
您可以创建动画并将其应用于按钮视图。例如:
// 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);
答案 2 :(得分:45)
扩展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();
}
答案 3 :(得分:26)
我只是在我的代码中使用了简单的行,它起作用了:
myCusstomView.setRotation(45);
希望它适合你。
答案 4 :(得分:18)
XML中的一行
<View
android:rotation="45"
... />
答案 5 :(得分:17)
应用旋转动画(没有持续时间,因此没有动画效果)是比调用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);
答案 6 :(得分:6)
Joininig @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)字段
答案 7 :(得分:6)
答案 8 :(得分:1)
@ Ichorus的答案对于视图是正确的,但如果要绘制旋转的矩形或文本,可以在onDraw(或onDispatchDraw)回调中为视图执行以下操作:
(注意θ是所需旋转的x轴的角度,pivot是表示我们希望矩形旋转的点的Point,而horizontalRect是“在旋转之前”的矩形位置< / p>
canvas.save();
canvas.rotate(theta, pivot.x, pivot.y);
canvas.drawRect(horizontalRect, paint);
canvas.restore();
答案 9 :(得分:1)
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
}
}
答案 10 :(得分:0)
很简单, 在Java中
your_component.setRotation(15);
或
your_component.setRotation(295.18f);
以XML格式
<Button android:rotation="15" />
答案 11 :(得分:0)
如前所述,它是自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,因为尚未测量视图。您只需使用Android KTX中的doOnPreDraw
扩展名即可访问它,即:
view.apply {
doOnPreDraw {
pivotX = width.toFloat()
pivotY = height.toFloat()
}
}
答案 12 :(得分:0)
如果你想用动画动态制作:
view.animate()
.rotation(180)
.start();
就是这样