/* Copyright (C) 2014,2015 Björn Stelter * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/> */ package de.hu_berlin.informatik.spws2014.mapever.navigation; import android.graphics.Rect; import de.hu_berlin.informatik.spws2014.ImagePositionLocator.Point2D; import de.hu_berlin.informatik.spws2014.mapever.R; import de.hu_berlin.informatik.spws2014.mapever.largeimageview.LargeImageView; import de.hu_berlin.informatik.spws2014.mapever.largeimageview.OverlayIcon; public class ReferencePointIcon extends OverlayIcon { // Resource des zu verwendenden Bildes private static int refPointImageResource = R.drawable.ref_punkt; // Dauer des Verblassens und letztendlich zu erreichender Alpha-Wert private static float hiddenAlpha = 0.4f; private static long fadingTimeOut = 2000; private static long fadingTimeIn = 200; // Bildkoordinaten des Referenzpunktes private Point2D refPointPosition; // Zeitpunkt, zu dem der Referenzpunkt erstellt wurde private long timeStamp = 0; // //////////////////////////////////////////////////////////////////////// // //////////// CONSTRUCTORS // //////////////////////////////////////////////////////////////////////// /** * Erstelle Referenzpunkt an bestimmter Position. Verwende isFadedOut=false für neue Punkte, und true für das Laden * bestehender Punkte. Bitte darauf achten, time nur dann zu setzen, wenn der Punkt akzeptiert wurde (ggf. später * mit setTimestamp()). * * @param parentMapView die MapView * @param position Bildkoordinaten des Punktes * @param time Zeitpunkt der Erstellung des Punktes * @param isFadedOut Punkt ist bereits transparent */ public ReferencePointIcon(MapView parentMapView, Point2D position, long time, boolean isFadedOut) { // Superkonstruktor, registriert Icon bei der LIV super((LargeImageView) parentMapView); // Appresource als Bild setzen setDrawable(parentMapView.getResources().getDrawable(refPointImageResource)); // Setze Position setPosition(position); setTimestamp(time); // Soll der Punkt zu Beginn voll sichtbar oder transparent sein? if (isFadedOut) { // Alpha-Wert setzen um Punkt transparent zu machen. // (NICHT setAlpha() verwenden, da die Animationen nicht mit dem dadurch gesetzten Alpha-Wert sondern // mit irgendeinem anderen internen Wert arbeiten. Beides wird dann akkumuliert, sodass fadeIn() den Wert // nicht auf 1 ändern lässt, sondern auf 1*currentAlpha... Total bekloppt.) startFading(hiddenAlpha, hiddenAlpha, 0); } } // //////////////////////////////////////////////////////////////////////// // //////////// OVERLAYICON PROPERTY OVERRIDES // //////////////////////////////////////////////////////////////////////// @Override protected int getImagePositionX() { return refPointPosition.x; } @Override protected int getImagePositionY() { return refPointPosition.y; } @Override protected int getImageOffsetX() { return -getWidth() / 2; } @Override protected int getImageOffsetY() { return -getHeight() / 2; } @Override public Rect getTouchHitbox() { // Die Hitbox ist doppelt so groß wie das Bild, damit man die kleinen Referenzpunkte besser anklicken kann. // (Ist sinnvoll.) return new Rect( 2 * getImageOffsetX(), 2 * getImageOffsetY(), 2 * (getWidth() + getImageOffsetX()), 2 * (getHeight() + getImageOffsetY())); } // //////////////////////////////////////////////////////////////////////// // //////////// REFERENCEPOINT PROPERTIES // //////////////////////////////////////////////////////////////////////// /** * Gibt Bildkoordinaten des Referenzpunkts relativ zum Koordinatenursprung der Karte als Point2D zurück. */ public Point2D getPosition() { return refPointPosition; } /** * Setze Bildkoordinaten des Referenzpunktes relativ zum Koordinatenursprung der Karte * * @param position neue Position */ public void setPosition(Point2D position) { refPointPosition = position; // Darstellung aktualisieren update(); } /** * Gibt den Zeitpunkt der Erzeugung (Akzeptanz) des Referenzpunkts zurück. */ public long getTimestamp() { return timeStamp; } /** * Setzt den Zeitpunkt der Erzeugung des Referenzpunkts. */ public void setTimestamp(long time) { timeStamp = time; } // //////////////////////////////////////////////////////////////////////// // //////////// EVENT HANDLERS // //////////////////////////////////////////////////////////////////////// @Override public boolean onClick(float screenX, float screenY) { MapView mapView = (MapView) getParentLIV(); // Registriere den zugehörigen Referenzpunkt als potentiellen Löschungskandidaten bei der MapView. // Falls dies im aktuellen Zustand nicht möglich ist, gibt die Funktion false zurück. Behandel das Event // dann als nicht behandelt, sodass es zur MapView weitergereicht wird. return mapView.registerAsDeletionCandidate(this); } // //////////////////////////////////////////////////////////////////////// // //////////// DARSTELLUNG // //////////////////////////////////////////////////////////////////////// /** * Starte Verblassungsanimation des Referenzpunktes. */ public void fadeOut() { // von komplett sichtbar bis hiddenAlpha startFading(1, hiddenAlpha, fadingTimeOut); } /** * Starte Animation, die den Referenzpunkt wieder sichtbar macht. */ public void fadeIn() { // von hiddenAlpha bis komplett sichtbar startFading(hiddenAlpha, 1, fadingTimeIn); } }