【问题标题】:How to rotate a view from different angles?如何从不同角度旋转视图?
【发布时间】:2023-03-21 17:38:02
【问题描述】:

我正在尝试将 ImageButton 旋转 180 度,使其与反向纵向方向匹配。当我以与其他方向更改相同的方式执行此操作时,结果是完美的,但动画却不是。

 public void onOrientationChanged(int DeviceAngle) {
      float MyButtonCurrentAngle = MyButton.getRotation(); //Gets portrait rotation (0)
           if(DeviceAngle > 350 || DeviceAngle < 10) { //Portrait
                MyButton.animate().rotationBy(- MyButtonCurrentAngle).setDuration(100).start();
           } else if(DeviceAngle > 80 && DeviceAngle < 100) { //Reverse Landscape
                MyButton.animate().rotationBy(-90 - MyButtonCurrentAngle ).setDuration(100).start();
            } else if(DeviceAngle > 170 && DeviceAngle < 190) { //Reverse Portrait
                MyButton.animate().rotationBy(180 -  MyButtonCurrentAngle).setDuration(100).start();
           } else if(DeviceAngle > 260 && DeviceAngle < 280) { //Landscape
                MyButton.animate().rotationBy(90 - MyButtonCurrentAngle ).setDuration(100).start();
           }          

我认为会发生这种情况,因为浮动 MyButtonCurrentAngle 从 350 到 10(0 或 360,纵向)之间的 DeviceAngle 获取 MyButton 旋转角度值(0 或未旋转)并将其用作参考。

即使我仍然怀疑,我还是放弃了之前的案例。浮动似乎适用于其他方向,我认为问题在于反向纵向方向的动画。按钮不应旋转 180 度,而应旋转 90 度或 -90 度。这是因为您无法在不通过任一横向选项的情况下将设备从纵向旋转到反向纵向。 (不能直接将 Portrait 旋转到 Reverse Portrait)。

经过多次不成功的尝试,我得出的结论是,在按钮旋转并且检测到的方向是横向或反向横向之后,我无法使用 MyButton 获取角度值。我想过创建另一个浮动来获取 Reverse Portrait MyButton 角度值,但是这个活动的方向设置为 Portrait,所以这没有意义。

因此,我需要在使用浮点数旋转 MyButton 后获取旋转角度,将此值用作循环条件,并根据结果在两个不同的动画中将其旋转 90 度或 -90 度。这是我解决这个问题的最新方法:

    while (MyButtonCurrentAngle==90) { 
    if (DeviceAngle > 170 && DeviceAngle < 190) {
        MyButton.animate().rotationBy(90 - MyButtonCurrentAngle).setDuration(100).start();
    }
}
while (MyButtonCurrentAngle==270) { 
    if (DeviceAngle > 170 && DeviceAngle < 190) {
        MyButton.animate().rotationBy(-90 - MyButtonCurrentAngle).setDuration(100).start();
    }
}

基本上,这会处理从横向和反向横向到反向纵向的设备方向。这没有触发任何动画,所以 MyButtonCurrentAngle 浮动角度值从未改变或无法检测到?为什么 if 语句不能读取它?我不知道,我想知道我做错了什么。提前致谢。

【问题讨论】:

  • 张贴xml,MyButtonCurrentAngleButtonsAngle是什么
  • 确保ifs 中的代码可访问。尝试在ifs中打印一些日志
  • MyButtonCurrentAngle 是我的按钮浮动示例,它通过 getRotation 获取其当前旋转值。 ButtonsAngle 是 onOrientationChanged int,它们都不在 xml 文件中。一切正常,不会崩溃。问题是我希望我的按钮从 90 变为 180 和从 270 变为 180对应的[肖像])。
  • 您确定 if 中的代码正在执行吗?
  • 我不确定,但我知道一切正常,直到我现在遇到这个反向肖像问题。 (当然,这包括动画和 xml 文件。此外,该应用永远不会崩溃)。

标签: android boolean android-animation screen-orientation android-orientation


【解决方案1】:

解决方案:

  OrientationEventListener OrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_UI) {
        static final int DELTA = 20;

        @Override 
        public void onOrientationChanged(int Angle) {
            float AngleDestination = ButtonDestination;
            if (angle > 90 - DELTA && angle < 90 + DELTA) {
                AngleDestination = -90;
            } else if (Angle > 180 - DELTA && Angle < 180 + DELTA) {
                AngleDestination = 180;
            } else if (Angle > 270 - DELTA && Angle < 270 + DELTA) {
                AngleDestination = 90;
            } else if (Angle > 360 - DELTA || Angle < DELTA) {
                AngleDestination = 0;
            } 
            if (AngleDestination != ButtonDestination) {
                ButtonDestination = AngleDestination;
                MyButton.animate().rotation(ButtonDestination).setDuration(100).start(); 
            } 
        } 
    }; 
    orientationEventListener.enable();
}

【讨论】:

    【解决方案2】:

    如果您发现此代码正在运行(通过断点调试或 Logcat 语句),请尝试在 UI 线程上运行动画。

    YourActivity.runOnUiThread(new Runnable() {
        public void run() 
            MyButton.animate().rotationBy(90 - MyButtonCurrentAngle).setDuration(100).start();
        }
    });
    

    您可能还需要调用 start 。

    【讨论】:

    • 这将如何解决我的问题?其他动画确实开始了。问题是我无法检查按钮旋转角度值并给出足够的响应。
    • 所以我想我对这个问题感到困惑。重新阅读 - 您正在尝试将图像按钮旋转 180 度,与屏幕方向无关?
    • 是的,我编辑它是为了更好地解释自己。它不仅应取决于方向(反向纵向),还应取决于到达该方向的方式。从横向(按钮旋转 90 度)或反向横向(按钮从原始位置旋转 -90 度)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2017-08-19
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2019-04-15
    相关资源
    最近更新 更多