在Android中旋转视图

时间:2009-12-18 22:09:46

标签: android view rotation

我有一个按钮,我想放在45度角。出于某种原因,我不能让这个工作。

有人可以提供完成此操作的代码吗?

13 个答案:

答案 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)

使用rotate()旋转视图不会影响视图的测量大小。因此,旋转视图将被剪裁或不适合父布局。这个库修复了它:

https://github.com/rongi/rotate-layout

enter image description here

答案 8 :(得分:1)

@ Ichorus的答案对于视图是正确的,但如果要绘制旋转的矩形或文本,可以在onDraw(或onDispatchDraw)回调中为视图执行以下操作:

(注意θ是所需旋转的x轴的角度,pivot是表示我们希望矩形旋转的点的Point,而horizo​​ntalRect是“在旋转之前”的矩形位置< / 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();

就是这样