如何旋转对话框(带动画)?
Posted
技术标签:
【中文标题】如何旋转对话框(带动画)?【英文标题】:How to rotate a dialog (with animation)? 【发布时间】:2021-12-08 03:32:15 【问题描述】:我目前正在开发一个相机应用程序,并将主要活动锁定为纵向模式,并手动听取方向更改以旋转主要活动上的图标,一切正常。现在我想用我的应用程序的设置对话框复制同样的东西。我尝试旋转对话框的根视图,它确实会旋转,但随后会根据纵向对话框的原始高度进行裁剪。
人像模式:
横向模式:
对话框的XML代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_
android:layout_
android:background="@drawable/settings_bg"
android:paddingHorizontal="@dimen/settings_dialog_padding_horizontal"
android:paddingVertical="@dimen/settings_dialog_padding_vertical"
android:orientation="vertical">
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal">
<ToggleButton
android:id="@+id/location_toggle"
android:layout_
android:layout_
android:textOn=""
android:textOff=""
android:checked="false"
android:background="@drawable/location"
android:layout_marginStart="4dp"
android:text="@string/toggle_button"/>
<ToggleButton
android:id="@+id/aspect_ratio_toggle"
android:layout_
android:layout_
android:textOn=""
android:textOff=""
android:checked="false"
android:scaleType="centerCrop"
android:background="@drawable/aspect_ratio"
android:layout_marginStart="@dimen/settings_toggle_button_spacing"
android:text="@string/aspect_ratio"/>
<ToggleButton
android:id="@+id/torch_toggle_option"
android:layout_
android:layout_
android:textOn=""
android:textOff=""
android:layout_marginStart="@dimen/settings_toggle_button_spacing"
android:checked="false"
android:scaleType="centerCrop"
android:background="@drawable/torch"
android:text="@string/aspect_ratio"/>
<ImageView
android:id="@+id/flash_toggle_option"
android:src="@drawable/flash_off_circle"
android:layout_
android:layout_
android:layout_marginStart="@dimen/settings_toggle_button_spacing"
android:contentDescription="@string/toggle_flash" />
<ImageView
android:id="@+id/grid_toggle_option"
android:src="@drawable/grid_off_circle"
android:layout_
android:layout_
android:layout_marginStart="@dimen/settings_toggle_button_spacing"
android:contentDescription="@string/grid_toggle" />
</LinearLayout>
<View
android:layout_marginTop="14dp"
android:layout_marginBottom="4dp"
android:layout_
android:layout_
android:background="@android:color/darker_gray"/>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<LinearLayout
android:layout_
android:layout_
android:paddingVertical="@dimen/settings_dialog_menu_item_vertical"
android:paddingHorizontal="@dimen/settings_dialog_menu_item_horizontal"
android:layout_gravity="end"
android:orientation="horizontal">
<TextView
android:layout_
android:layout_
android:layout_gravity="center_vertical"
android:text="@string/video_quality" />
<FrameLayout
android:layout_
android:padding="0dp"
android:layout_margin="0dp"
android:layout_>
<Spinner
android:id="@+id/video_quality_spinner"
android:layout_
android:layout_
android:checked="true"
android:padding="0dp"
android:layout_margin="0dp"
android:layout_gravity="end"/>
</FrameLayout>
</LinearLayout>
<RelativeLayout
android:layout_
android:layout_
android:paddingHorizontal="@dimen/settings_dialog_menu_item_horizontal"
android:paddingVertical="@dimen/settings_dialog_menu_item_vertical"
android:orientation="horizontal">
<TextView
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_
android:layout_
android:layout_gravity="center_vertical|start"
android:text="@string/emphasize_on" />
<RadioGroup
android:id="@+id/cm_radio_group"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_
android:layout_
android:layout_gravity="center_vertical|end"
android:orientation="horizontal">
<RadioButton
android:id="@+id/quality_radio"
android:layout_
android:layout_
android:text="@string/quality"
android:checked="true" />
<View
android:layout_
android:layout_/>
<RadioButton
android:id="@+id/latency_radio"
android:layout_
android:layout_
android:text="@string/latency"
android:checked="false" />
</RadioGroup>
</RelativeLayout>
<LinearLayout
android:layout_
android:layout_
android:paddingVertical="@dimen/settings_dialog_menu_item_vertical"
android:paddingHorizontal="@dimen/settings_dialog_menu_item_horizontal"
android:orientation="horizontal">
<TextView
android:layout_
android:layout_
android:layout_gravity="center_vertical"
android:text="@string/include_audio" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/include_audio_switch"
android:layout_
android:layout_
android:checked="true"
android:layout_gravity="end"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
监听方向变化的代码:
override fun onOrientationChange(orientation: Int)
// [...]
rotateView(
settingsDialog.findViewById(R.id.root),
iconRotation
)
private fun rotateView(view: View?, angle: Float)
if (view!=null)
view.animate().cancel()
view.animate()
.rotationBy(angle)
.setDuration(400)
.setInterpolator(LinearInterpolator())
.start()
有什么办法可以解决这个问题吗?
应用程序仓库:https://github.com/GrapheneOS/Camera
【问题讨论】:
如果您的问题只是不正确的裁剪,您是否尝试过使用 layout_weight 属性?显示对话框的中心块应该占据尽可能多的空间。将 layout_weight 设置为 1,将 layout_width 设置为 0dp。 是的,实际上这里唯一的问题是不正确的裁剪 应该在哪里设置layout_weight? 我自己没有做过,但看起来这个库可能有助于解决剪辑问题:github.com/rongi/rotate-layout 如果它不适用于对话框,您可以让对话框全屏显示有透明背景,里面有这个布局。或者不使用 Dialog,而是将此布局添加和删除到您的主布局中。 @ShyamSingh 在您将 layout_weight 设置为 0dp 的同一元素中。包含对话框的中心元素。你可以在这里阅读更多:***.com/questions/3995825/… 【参考方案1】:我解决了这个问题,
使用额外的 FrameLayout 作为主要父级。
将对话框的主题设置为确保没有标题栏的全屏对话框(在我的例子中是主应用主题)。
在对话框下方设置透明背景,并在它为 时关闭整个对话框。
(手动加载动画并在布局中的对话框视图上专门调用它们)。
所有这些东西都可以在 Google 上轻松搜索到(以防您不熟悉 Android 开发)。
以下是我对存储库所做的代码更改。 (忽略对 anim/xxx_xxx.xml 文件所做的更改):
https://github.com/GrapheneOS/Camera/commit/13de8a7459754d28385fa0b523fcbf7fc0056ba1
【讨论】:
如果有人需要任何其他信息,请告诉我。关于这个解决方案以上是关于如何旋转对话框(带动画)?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过onclick list项打开带动画的alertdialog? [关闭]
在线急等,关于网页中如何通过threejs 导入带动画的模型