在Android中旋转视图

在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

我有一个按钮,我想把一个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();

} 
@覆盖
受保护的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();