Android делит изображение на несколько регионов для событий onClick - PullRequest
0 голосов
/ 21 февраля 2019

В этом приложении у меня есть, например, изображение, представляющее карту Германии.Я хочу иметь возможность щелкнуть одно конкретное состояние, например, Баварию, и что-то должно произойти (функция щелчка).

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

Другое решение может бытьсоздать два изображения карты.Один с разными цветами состояний, а другой с желаемой раскладкой для отображения.Поместите цветной как невидимый поверх второго.

XML:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/my_frame"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:background="@color/background" >
 <ImageView 
     android:id="@+id/image_areas"
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:scaleType="fitCenter"
     android:visibility="invisible"
     android:src="@drawable/mapcolor" />

 <ImageView
     android:id="@+id/image"
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:scaleType="fitCenter"
     android:src="@drawable/mapdisplay"/>
</FrameLayout>

Java:

public boolean onTouch (View v, MotionEvent ev) {
     final int action = ev.getAction();
     // (1) 
     final int evX = (int) ev.getX();
     final int evY = (int) ev.getY();
     switch (action) {
     case MotionEvent.ACTION_DOWN :
       if (currentResource == R.drawable.mapdisplay) { 
       } 
       break;
     case MotionEvent.ACTION_UP :
       // Switch to a different image, depending on what color was touched.
       int touchColor = getHotspotColor (R.id.image_areas, evX, evY);
       // Switch to a different image, depending on what color was touched.
       ColorTool ct = new ColorTool ();
       int tolerance = 25;
       nextImage = R.drawable.mapdisplay;
       // (3)
       if (ct.closeMatch (Color.RED, touchColor, tolerance)) {
          // Do the action associated with the RED region
          // onClick function here ?
       } else {
         //...
       }
       break;
      } // end switch
      return true;
}

Инструмент цвета:

public class ColorTool {
    public boolean closeMatch (int color1, int color2, int tolerance) {
        if ((int) Math.abs (Color.red (color1) - Color.red (color2)) > tolerance ) return false;
        if ((int) Math.abs (Color.green (color1) - Color.green (color2)) > tolerance ) return false;
        if ((int) Math.abs (Color.blue (color1) - Color.blue (color2)) > tolerance ) return false;
        return true;
    } // end match
} // end class

Как и ожидалось, это не работает для меня.Может кто-нибудь объяснить мне этот метод или хороший способ иметь «карту» изображения с несколькими регионами для нажатия?

1 Ответ

0 голосов
/ 21 февраля 2019

Я думал о двухмерной матрице с картой состояний.Должна быть начальная версия матрицы, которая отображает разные номера для разных регионов в зависимости от их местоположения.Для большего или меньшего размера экрана матрица должна быть динамической и перераспределенной между пикселями.Давайте рассмотрим следующую сетку в качестве примера.

--------------
00111122224444
01111222222444
11122222444444
11222244444433
12222444444333
22224444444433
22255444444333
22555554443333
25555555433333
--------------

Мы можем видеть здесь 5 состояний с их соответствующей нумерацией в матрице, которая следует за картой.Если размер экрана удваивается, необходимо перевести значения, чтобы получить больший сегмент, и наоборот.

Я думал о том, чтобы построить такую ​​матрицу, которая может быть переведена в большие или меньшие размеры в зависимости от размера экрана.Теперь вам нужно установить изображение карты в качестве фона экрана и взять onTouchListener, чтобы получить пиксель области, к которой вы прикоснулись, чтобы определить, по какой области щелкают.

Это просто, чтобы дать представление о том, как эта проблема может быть решена.Я нашел одну похожую идею здесь, в MapChart .Надеюсь, это поможет!

...