避免方向改变时的动画以防止难看的视图拉伸
Avoid animation on orientation change to prevent ugly view stretching
简介
我的应用程序应该显示一个填满整个屏幕但保持二次方的按钮。我通过引用方向依赖维度值实现了这一点:
activity_main.xml
<ImageButton
android:id="@+id/fartbutton"
android:layout_width="@dimen/fartbuttonWidth"
android:layout_height="@dimen/fartbuttonHeight"
android:layout_gravity="center"
android:src="@drawable/sel_fart_button"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:clickable="false"/>
dimens-land/dimens.xml
<resources>
<dimen name="fartbuttonWidth">@dimen/wrap_content</dimen>
<dimen name="fartbuttonHeight">@dimen/match_parent</dimen>
</resources>
dimens-port/dimens.xml
<resources>
<dimen name="fartbuttonWidth">@dimen/match_parent</dimen>
<dimen name="fartbuttonHeight">@dimen/wrap_content</dimen>
</resources>
这是为了确保无法通过触摸屏幕顶部来按下 ImageButton
,因为屏幕顶部离图像很远。
从那以后,我实施了一项检查以确保该按钮仅对图像不透明部分的按压做出反应,而忽略透明区域的触摸。这可能不再是必要的了。
我还编写了一个小部件,我认为我无法以编程方式更改其布局。这就是为什么首选完全在 XML 文件中解决以下问题的解决方案。
问题
我知道当我改变设备的方向时,activity 会被完全破坏并重新创建。在那个过程中,OS 在两个状态之间转换,并有一个很好的(和想要的)旋转。然而,它也以丑陋的方式拉伸和淡化两个按钮,如图所示。
我假设它试图尊重旧按钮的 match_parent
属性,因此拉伸图像以匹配完整的新宽度。
我已经搜索过如何禁用 activity 转换并试图找到解决我的问题的现有方法。可悲的是,由于大多数人都想 添加 自定义动画以改变方向或禁用旋转动画 完全 ,我对这个问题的搜索还没有成功。
有没有一种简单的方法可以避免这种丑陋的拉伸?共享元素 activity 过渡是否有效?您想到了哪些解决方案? :)
编辑
第一次编辑
似乎将所有尺寸设置为 wrap_content
(甚至 FrameLayout
的尺寸)并将按钮的尺寸固定为 200dp 不起作用。现在我假设 OS 只是截取屏幕截图并将其拉伸到新的横向比例,反之亦然。
有没有办法禁用此行为?新按钮是完全不透明的,可以很好地旋转。禁用淡入淡出动画可能就足够了。
第二次编辑
我现在在我的 phone 上的 所有 应用程序中注意到了这种行为。我找不到告诉 Android 不要这样做的方法...:(
您可以通过子类化 FrameLayout 并覆盖 onMeasure 来创建方形 FrameLayout:
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int size = width > height ? height : width;
setMeasuredDimension(size, size);
}
然后将您的按钮包裹在布局中的这个 FrameLayout 中。
如 pointed out referring to this answer,好像没有解决办法。它是 "feature" Android 提供的,程序员无法轻松控制它。
简介
我的应用程序应该显示一个填满整个屏幕但保持二次方的按钮。我通过引用方向依赖维度值实现了这一点:
activity_main.xml
<ImageButton
android:id="@+id/fartbutton"
android:layout_width="@dimen/fartbuttonWidth"
android:layout_height="@dimen/fartbuttonHeight"
android:layout_gravity="center"
android:src="@drawable/sel_fart_button"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:clickable="false"/>
dimens-land/dimens.xml
<resources>
<dimen name="fartbuttonWidth">@dimen/wrap_content</dimen>
<dimen name="fartbuttonHeight">@dimen/match_parent</dimen>
</resources>
dimens-port/dimens.xml
<resources>
<dimen name="fartbuttonWidth">@dimen/match_parent</dimen>
<dimen name="fartbuttonHeight">@dimen/wrap_content</dimen>
</resources>
这是为了确保无法通过触摸屏幕顶部来按下 ImageButton
,因为屏幕顶部离图像很远。
从那以后,我实施了一项检查以确保该按钮仅对图像不透明部分的按压做出反应,而忽略透明区域的触摸。这可能不再是必要的了。
我还编写了一个小部件,我认为我无法以编程方式更改其布局。这就是为什么首选完全在 XML 文件中解决以下问题的解决方案。
问题
我知道当我改变设备的方向时,activity 会被完全破坏并重新创建。在那个过程中,OS 在两个状态之间转换,并有一个很好的(和想要的)旋转。然而,它也以丑陋的方式拉伸和淡化两个按钮,如图所示。
我假设它试图尊重旧按钮的 match_parent
属性,因此拉伸图像以匹配完整的新宽度。
我已经搜索过如何禁用 activity 转换并试图找到解决我的问题的现有方法。可悲的是,由于大多数人都想 添加 自定义动画以改变方向或禁用旋转动画 完全 ,我对这个问题的搜索还没有成功。
有没有一种简单的方法可以避免这种丑陋的拉伸?共享元素 activity 过渡是否有效?您想到了哪些解决方案? :)
编辑
第一次编辑
似乎将所有尺寸设置为 wrap_content
(甚至 FrameLayout
的尺寸)并将按钮的尺寸固定为 200dp 不起作用。现在我假设 OS 只是截取屏幕截图并将其拉伸到新的横向比例,反之亦然。
有没有办法禁用此行为?新按钮是完全不透明的,可以很好地旋转。禁用淡入淡出动画可能就足够了。
第二次编辑
我现在在我的 phone 上的 所有 应用程序中注意到了这种行为。我找不到告诉 Android 不要这样做的方法...:(
您可以通过子类化 FrameLayout 并覆盖 onMeasure 来创建方形 FrameLayout:
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int size = width > height ? height : width;
setMeasuredDimension(size, size);
}
然后将您的按钮包裹在布局中的这个 FrameLayout 中。
如