android - usos - ventajas y desventajas de imagenes vectoriales
Cómo seleccionar un mosaico en particular al hacer clic e inflar un mapa de bits en él en tileview android (1)
Estoy mostrando una imagen grande usando Tileview
usando la biblioteca TileView
Ahora quiero mostrar un círculo en un límite recto cuando se hace clic en determinados mosaicos.
¿Cómo conseguir en qué azulejo se pinchó? ¿Y cómo mostrar BitMmap
sobre ese mosaico?
public class LargeImageTileViewActivity extends TileViewActivity {
TileView tileView;
@Override
public void onCreate( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
// multiple references
tileView = getTileView();
// by disabling transitions, we won''t see a flicker of background color when moving between tile sets
tileView.setTransitionsEnabled( false );
// size of original image at 100% scale
tileView.setSize( 2835, 4289 );
// detail levels
tileView.addDetailLevel( 1.000f, "tiles/painting/1000/%col%_%row%.jpg");
tileView.addDetailLevel( 0.500f, "tiles/painting/500/%col%_%row%.jpg");
tileView.addDetailLevel( 0.250f, "tiles/painting/250/%col%_%row%.jpg");
tileView.addDetailLevel( 0.125f, "tiles/painting/125/%col%_%row%.jpg");
// set scale to 0, but keep scaleToFit true, so it''ll be as small as possible but still match the container
tileView.setScale( 0 );
// let''s use 0-1 positioning...
tileView.defineRelativeBounds( 0, 0, 1, 1 );
// frame to center
frameTo( 0.5, 0.5 );
tileView.addTileViewEventListener( listener );
}
private TileViewEventListenerImplementation listener = new TileViewEventListenerImplementation(){
public void onTap( int x, int y ) {
SampleCallout callout = new SampleCallout(LargeImageTileViewActivity.this);
tileView.slideToAndCenter(x, y);
//Toast.makeText(mContext, "Center " + tempStore.getCenterX() + " " + tempStore.getCenterY(), Toast.LENGTH_SHORT).show();
tileView.addCallout(callout, x, y, -0.5f, -1.0f);
callout.transitionIn();
}
};
}
Al excavar un poco en la biblioteca, me parece que no podrá obtener el mosaico sin modificar el código (es posible que no necesite obtener el mosaico, vea más en la opción 2), aunque es de código abierto. , para que puedas hacer tus modificaciones localmente y partir desde allí.
Primera opción:
Primera modificación que necesitas:
En https://github.com/moagrius/TileView/blob/master/src/com/qozix/tileview/detail/DetailManager.java
Agregue el siguiente código:
public DetailLevel getCurrentDetailLevel() {
return currentDetailLevel;
}
En https://github.com/moagrius/TileView/blob/master/src/com/qozix/tileview/TileView.java
public DetailManager getDetailManager() {
return detailManager;
}
Esto expone el método que necesita en DetailLevel, por ejemplo
public LinkedList<Tile> getIntersections()
La cual devolverá los mosaicos en su puerto de vista actual, cada mosaico sabe que está delimitado por la izquierda / derecha y arriba / abajo, para que pueda recorrer los mosaicos y encontrar el que hizo clic.
Segunda opción (recomendada si es posible):
Ya que conoce los rects para todas sus cosas, simplemente puede agregar HotSpots, en la biblioteca parece que los HotSpots son rects que admiten escuchas de clics.
Puedes agregar un HotSpot como este:
HotSpot hotSpot = new HotSpot(left, top, right, bottom);
hotSpot.setHotSpotEventListener(this);
tileView.addHotSpot(hotSpot);
....
public void onHotSpotTap(HotSpot hotSpot, int x, int y){
Do your gui update using the supplied hotSpot above
}
Más información: https://github.com/moagrius/TileView/blob/master/src/com/qozix/tileview/hotspots/HotSpot.java
Añadiendo el circulo
La biblioteca admite marcadores, simplemente puede agregar una vista de imagen con su círculo como el marcador, así
ImageView view = new ImageView (this);
view.setImageResource(circleId);
tileView.addMarker (view, tile.x, tile.y);