Android - 可滚动和可旋转的FrameLayout

时间:2014-09-13 19:43:38

标签: android android-layout android-scrollview

我需要准备FrameLayout(包含比屏幕尺寸大得多的ImageView和其他ImageViews - 叠加),这必须是同时的:

  • 可以任意角度旋转
  • 水平和垂直滚动

对于滚动,我使用此处提供的解决方案:https://stackoverflow.com/a/6716638/2274709

我的代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">


    <com.chrosciu.konferencja.VScroll android:layout_height="fill_parent"
        android:layout_width="fill_parent" android:id="@+id/vScroll">
        <com.chrosciu.konferencja.HScroll android:id="@+id/hScroll"
            android:layout_width="fill_parent" android:layout_height="fill_parent">

            <FrameLayout
                android:id="@+id/frameLayout"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                >

                <ImageView
                    android:id="@+id/planView"
                    android:src="@drawable/map"
                    android:scaleType="center"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    />

            </FrameLayout>

        </com.chrosciu.konferencja.HScroll>
    </com.chrosciu.konferencja.VScroll>


</RelativeLayout>

MainActivity.java:

  ...

 private void rotate(float angle) {
        FrameLayout frameLayout = (FrameLayout)findViewById(R.id.frameLayout);
        frameLayout.setRotation(angle);
 }

  ....

然而这会引起一些麻烦:FrameLayout在旋转后被裁剪,即使手动滚动也无法到达角落

即使我将FrameLayout的minHeight和minWidth设置为在旋转后放大它,结果仍然不能令人满意:

  • 一旦我扩大了FrameLayout的尺寸,我就无法缩回它,
  • 我必须手动滚动布局以适应放大的区域

这似乎不是一个奇特的任务。我走对了路吗?有没有其他方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

最后,我设法实现了一些可用的东西。这仍然不是我预期的100%,但足以达到我的目的。谢谢@pskink指导...

解决方案如下:

  • 计算ImageView的对角线大小(我们假设ImageView是 矩形)
  • 将FrameLayout的minHeight和minWidth设置为等于 这个对角线(四舍五入到最接近的整数)
  • 将ImageView(通过setX()和setY())移动到FrameLayout的中心

使用任何角度旋转ImageView后的这些假设,它将始终位于FrameLayout内部,永远不会被裁剪。