【问题标题】:Rotating a view in Android在 Android 中旋转视图
【发布时间】:2010-12-28 04:58:39
【问题描述】:

我有一个按钮,我想以 45 度角放置。出于某种原因,我无法让它工作。

有人可以提供代码来完成这个吗?

【问题讨论】:

  • 一个简单的解决方案,@Michale 的回答就像魅力一样 :) XML 中的一行
  • 你是对的@Muahmmad,但它只有在你想从 xml 中执行时才会有所帮助,但如果我们想像单击按钮那样动态地执行它,那么它将不起作用..

标签: android view rotation


【解决方案1】:

API 11 为所有视图添加了 setRotation() 方法。

【讨论】:

  • @GerhardBarnard setRotation() 是使用的方法,也是答案本身。该链接只是为了方便起见。
【解决方案2】:

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

    // 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) 来实现。
  • 这将正确旋转视图,但按钮不会旋转其功能。对我来说不是圣杯:)
  • 事实证明,没有任何方法可以旋转按钮的功能。我最终根据触摸屏幕的位置将事件转发到按钮。
【解决方案3】:

扩展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 度角。只是没有里面的文字。不过谢谢你回答我的问题
  • 如果你想旋转整个视图(连同它的背景),你应该覆盖 draw() 而不是 onDraw()。
  • 好的,如果使用 draw() 方法旋转整个按钮但不能正确绘制视图,它可以工作
  • 不需要保存整个画布状态,canvas.save(Canvas.MATRIX_SAVE_FLAG) 就足够了。
【解决方案4】:

我只是在我的代码中使用了简单的一行,它可以工作:

myCusstomView.setRotation(45);

希望它对你有用。

【讨论】:

  • 注意:此方法从 API 11 (Honeycomb) 开始可用
  • 在旋转视图(ImageView)后是否可以使用该旋转保存图像??
【解决方案5】:

XML 中的一行


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

【讨论】:

    【解决方案6】:

    应用旋转动画(没有持续时间,因此没有动画效果)是比调用 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);
    

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

      • 这是一项不错的工作,但如果控件比屏幕尺寸宽?如何让它适合屏幕?
      【解决方案8】:

      加入@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)字段

      【讨论】:

        【解决方案9】:

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

        在 Activity 的 onCreate() 或 Fragment 的 onCreateView(...) 中,宽度和高度等于 0,因为尚未测量视图。您只需使用来自Android KTXdoOnPreDraw 扩展名即可访问它,即:

        view.apply {
            doOnPreDraw {
                pivotX = width.toFloat()
                pivotY = height.toFloat()
            }
        }
        

        【讨论】:

          【解决方案10】:

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

          (请注意,theta 是与所需旋转的 x 轴的角度,pivot 是表示我们希望矩形围绕其旋转的点的点,horizo​​ntalRect 是矩形“在”旋转之前的位置)

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

          【讨论】:

            【解决方案11】:
            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
                }
            }
            

            【讨论】:

              【解决方案12】:

              如果您希望通过动画使其动态化:

              view.animate()
                  .rotation(180)
                  .start();
              

              就是这样

              【讨论】:

                【解决方案13】:

                这很简单, 在Java中

                your_component.setRotation(15);
                

                your_component.setRotation(295.18f);
                

                在 XML 中

                <Button android:rotation="15" />
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-08-27
                  • 2016-01-22
                  相关资源
                  最近更新 更多