我有一个要以45度角放置的按钮。由于某种原因,我无法使它正常工作。
有人可以提供代码来完成此操作吗?
我有一个要以45度角放置的按钮。由于某种原因,我无法使它正常工作。
有人可以提供代码来完成此操作吗?
Answers:
您可以创建动画并将其应用于按钮视图。例如:
// 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();
}
与调用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()
不会影响视图的测量尺寸。结果,旋转的视图将被剪切或不适合父布局。该库可以修复它:
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)字段
@Ichorus的答案对于视图是正确的,但是如果要绘制旋转的矩形或文本,则可以在视图的onDraw(或onDispatchDraw)回调中执行以下操作:
(请注意,theta是与所需旋转的x轴的夹角,pivot是Point,它表示矩形要旋转的点,horizontalRect是矩形“在旋转之前”的位置)
canvas.save();
canvas.rotate(theta, pivot.x, pivot.y);
canvas.drawRect(horizontalRect, paint);
canvas.restore();
如前所述,rotation
自API 11以来最简单的使用方式是:
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()
}
}
用Java很简单
your_component.setRotation(15);
要么
your_component.setRotation(295.18f);
在XML中
<Button android:rotation="15" />