避免在方向更改时动画,以防止丑陋的视图拉伸

时间:2016-03-02 00:28:44

标签: android animation orientation-changes

简介

我的应用应该会显示一个填满整个屏幕的按钮,但保持二次方式。我通过引用orientation-dependend dimen-values完成了这个:

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.xml

<resources>
    <dimen name="fartbuttonWidth">@dimen/wrap_content</dimen>
    <dimen name="fartbuttonHeight">@dimen/match_parent</dimen>
</resources>

梦诗端口/ dimens.xml

<resources>
    <dimen name="fartbuttonWidth">@dimen/match_parent</dimen>
    <dimen name="fartbuttonHeight">@dimen/wrap_content</dimen>
</resources>

这是为了确保触摸屏幕顶部(图片远离图像)无法按下ImageButton
我已经实施了检查以确保按钮仅对图像的不透明部分上的按压作出反应,忽略对透明区域的触摸。那可能不再那么必要了。

我还编写了一个小部件,我认为我无法以编程方式更改布局。这就是为什么优先解决完全在XML文件中工作的以下问题的原因。

问题

我知道当我更改设备的方向时,活动会被完全破坏并重新创建。在该过程中,OS在两个状态之间转换,具有良好(和想要的)旋转。但是,它也会以丑陋的方式拉伸和淡化两个按钮,如图所示。

enter image description here

我认为它会尝试尊重旧按钮的match_parent属性,因此会拉伸图像以匹配全新的宽度。

我已经搜索了如何禁用活动转换,并尝试找到问题的现有解决方案。遗憾的是,由于大多数人都希望添加自定义动画进行方向更改或完全禁用旋转动画 ,我对此问题的搜索还没有成功。

有没有一种简单的方法来规避这种难看的拉伸?共享元素活动转换是否有效?您有什么解决方案? :)

编辑

首先编辑

似乎将所有维度设置为wrap_content(即使是FrameLayout的维度),并将按钮的维度固定为200dp不起作用。现在我假设操作系统只是截取屏幕截图并将其拉伸到新的景观比例,反之亦然。

有没有办法禁用此行为?新按钮完全不透明,旋转得很好。它可能足以禁用淡入淡出的动画。

第二次编辑

我现在在手机上的所有应用中发现了这种行为。我找不到一种方法来告诉Android不要这样做...... :(

2 个答案:

答案 0 :(得分:0)

您可以通过继承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中。

答案 1 :(得分:0)

正如Rahil2952所指出的this answer,似乎没有解决方案。这是Android提供的“功能”,程序员无法轻易控制它。