В этом приложении у меня есть, например, изображение, представляющее карту Германии.Я хочу иметь возможность щелкнуть одно конкретное состояние, например, Баварию, и что-то должно произойти (функция щелчка).
Возможно, я поместу макет таблицы поверх изображения, заполненного пустыми изображениями, и активируюметод «нажми» только на тот, который охватывает состояния, но это, вероятно, плохое кодирование, и я думаю, что оно будет плохо совместимо с другими типами устройств, планшетов или экранов большего или меньшего размера.
Другое решение может бытьсоздать два изображения карты.Один с разными цветами состояний, а другой с желаемой раскладкой для отображения.Поместите цветной как невидимый поверх второго.
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
Как и ожидалось, это не работает для меня.Может кто-нибудь объяснить мне этот метод или хороший способ иметь «карту» изображения с несколькими регионами для нажатия?