在Android中旋转视图
我有一个按钮,我想把一个45度的角度。由于某种原因,我不能让它工作在Android中旋转视图,android,view,rotation,Android,View,Rotation,我有一个按钮,我想把一个45度的角度。由于某种原因,我不能让它工作 是否有人可以提供代码来完成此操作?扩展TextView类并重写onDraw()方法。确保父视图足够大,可以在不剪切旋转按钮的情况下处理该按钮 @Override protected void onDraw(Canvas canvas) { canvas.save(); canvas.rotate(45,<appropriate x pivot value>,<appropriate y pi
是否有人可以提供代码来完成此操作?扩展
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();
}
@覆盖
受保护的void onDraw(画布){
canvas.save();
画布。旋转(45,,);
super.onDraw(帆布);
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);
@Ichorus的答案对于视图是正确的,但是如果您想绘制旋转的矩形或文本,可以在视图的onDraw(或onDispatchDraw)回调中执行以下操作: (请注意,θ是与所需旋转的x轴的角度,枢轴是表示矩形要围绕其旋转的点的点,而horizontalRect是矩形旋转“之前”的位置)
API 11为所有视图添加了一个方法 我只是在代码中使用了简单的一行,它可以工作:
myCusstomView.setRotation(45);
希望对你有用 加入@Rudi和@Pete的答案。我已经创建了一个RotateAimation,它在旋转后还保留按钮功能 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)字段,应用旋转动画(没有持续时间,因此没有动画效果)比调用View.setRotation()或override 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()
旋转视图不会影响视图的测量大小。因此,旋转视图可能会被剪裁或不适合父布局。但此库修复了它:
XML中的一行
这很简单,
在爪哇
或
在XML中
<Button android:rotation="15" />
如前所述,自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,因为尚未测量视图。您只需使用扩展名from即可访问它,即:
如果希望使用动画动态制作,请执行以下操作:
view.animate()
.rotation(180)
.start();
这就是我想要的。我希望整个视图本身呈45度角。只是里面没有文字。但是谢谢你回答我的问题如果你想旋转整个视图(连同它的背景),你应该使用OVERRIDE draw()而不是onDraw()。如果使用draw()方法旋转整个按钮但不正确地旋转绘图视图,它可以工作。不需要保存整个画布状态,canvas.save(canvas.MATRIX\u save\u标志)足够了。很高兴看到不能定义布局的事情可以通过动画和setFillAfter(true)实现。这将正确地旋转视图,但按钮的功能不会旋转。不是我的圣杯:)事实证明,没有任何方法可以旋转按钮的功能。我最终根据触摸屏幕的位置将事件转发到按钮。注意:这种方法是可用的,因为旋转视图(ImageView)后API 11(蜂巢)可以使用这种方法保存图像吗?这是很好的工作,但如果控件的宽度大于屏幕大小?如何使其适合屏幕?@GerhardBarnard setRotation()是使用的方法,也是答案本身。这个链接只是为了方便。一个简单的解决方案,由@Michale回答,就像charm:)XML中的一行你是对的@Muahmmad,但它只会在你想从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
}
}
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()
...
view.apply {
doOnPreDraw {
pivotX = width.toFloat()
pivotY = height.toFloat()
}
}
view.animate()
.rotation(180)
.start();