Масштабирование в ScrollView2D

Я делаю пользовательскую 2D-карту, заполненную ImageViews, используя этот макет:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.nkraft.mobiletomblocator.ZoomableScrollView2D 
        android:id="@+id/scrollView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scrollbars="none" >

            <com.nkraft.mobiletomblocator.CustomGridLayout
                android:id="@+id/map_grid"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="#ffdedbba" >

                <!-- filling this up at run time, maybe a ~300x100 cells -->

            </com.nkraft.mobiletomblocator.CustomGridLayout>

    </com.nkraft.mobiletomblocator.ZoomableScrollView2D>

    <!-- Don't mind below this -->

    <LinearLayout
        android:id="@+id/popupDialogParent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:padding="30dp" >

        <include layout="@layout/custom_toast"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone" />

    </LinearLayout>

</RelativeLayout>

Где:

  • ZoomableScrollView2D - это двумерный скроллер, который может прокручиваться в обоих направлениях одновременно, и где я прикрепил свой эффект масштабирования, я нашел ЗДЕСЬ
  • CustomGridLayout — это обычный GridLayout, который я переопределяю onDraw(), чтобы рисовать другие вещи.

После того, как я все это настроил, я получаю такой неожиданный вывод:

перед масштабированием:

введите здесь описание изображения

после увеличения:

введите здесь описание изображения

Как сохранить границы отсечения этого CustomGridLayout после масштабирования? Вы знаете, тот, который можно было бы ожидать при масштабировании.


person mr5    schedule 01.10.2014    source источник
comment
Ваша проблема заключается в типе масштабирования, которое вы делаете. Вы не масштабируете содержимое сетки, а сам макет. Поэтому в основном измените масштабирование, чтобы оно применялось к содержимому, а не к макету.   -  person WarrenFaith    schedule 01.10.2014
comment
@WarrenFaith Означает ли это, что мне нужно будет масштабировать каждую ячейку внутри макета сетки?   -  person mr5    schedule 01.10.2014
comment
Существуют разные подходы, которые вы можете попробовать. Первое, что нужно сделать, это масштабировать холст, на котором вы рисуете, и с помощью математических вычислений вычислить, сколько нового пространства вам нужно заполнить ячейками (адаптироваться к новым границам). Другая возможность - масштабировать все, что вы рисуете. Я бы предпочел одноразовое масштабирование холста через canvas.scale() или canvas.[pre|post]Scale(). В основном это зависит от того, насколько легко вы можете получить доступ к холсту, на котором рисуете.   -  person WarrenFaith    schedule 01.10.2014
comment
@WarrenFaith Я пытался масштабировать сам макет сетки, но из-за моего недостатка дизайна приложение вылетает с OutOfMemoryException, поэтому масштабирование каждой ячейки для меня не подходит. Ну для холста сеточного макета я еще не пробовал. Хм, будет ли View по-прежнему кликабельно, если я масштабирую их с помощью подхода холста?   -  person mr5    schedule 01.10.2014
comment
Не уверен, как вы реализовали сам щелчок. Возможно, вам нужно немного посчитать, чтобы адаптировать прикосновение к масштабированию, чтобы получить правильный вид.   -  person WarrenFaith    schedule 01.10.2014