在Android中旋转视图


69

我有一个要以45度角放置的按钮。由于某种原因,我无法使它正常工作。

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


一个简单的解决方案,由@Michale回答,就像魅力一样:) XML中的一行<View android:rotation =“ 45” ... />
Muahmmad Tayyib,

你说得对@Muahmmad,但它会,如果你想从XML做只是帮助,但如果我们想这样做动态就像按一下按钮那么就不会工作..
维韦克Thummar

Answers:



59

您可以创建动画并将其应用于按钮视图。例如:

    // 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);

很高兴看到动画和setFillAfter(true)可以实现无法定义布局的事情。
2012年

这将旋转所有视图,但是按钮不会旋转其功能。不是我的圣杯:)
Warpzit 2012年

事实证明,没有任何方法可以旋转按钮的功能。我最终根据触摸屏幕的位置将事件转发到按钮。
Warpzit 2012年

47

扩展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();

} 

好的,那是我想要的。我希望整个视图本身成45度角。只是里面没有文字。但是,感谢您回答我的问题
马修(Matthew)2009年

3
如果要旋转整个视图(及其背景),则应覆盖draw()而不是onDraw()。
阿列克谢2012年

好的,如果使用draw()方法旋转整个按钮但无法正确绘制视图,则可以正常工作
Kailash Dabhi 2013年

无需保存整个画布状态,canvas.save(Canvas.MATRIX_SAVE_FLAG)就足够了。
Denis Gladkiy

27

我只是在代码中使用了简单的代码,它的工作原理是:

myCusstomView.setRotation(45);

希望对你有效。


4
注意:自API 11(Honeycomb)
nicopico

旋转view(ImageView)后,是否可以通过旋转保存图像?
2015年

26

XML中的一行


<View
    android:rotation="45"
    ... />

21

与调用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

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)字段


1

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

(请注意,theta是与所需旋转的x轴的夹角,pivot是Point,它表示矩形要旋转的点,horizo​​ntalRect是矩形“在旋转之前”的位置)

canvas.save();
canvas.rotate(theta, pivot.x, pivot.y);
canvas.drawRect(horizontalRect, paint);
canvas.restore();

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
    }
}

1

如前所述,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()
    }
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.