All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.qozix.tileview.detail.DetailLevel Maven / Gradle / Ivy

Go to download

The TileView widget is a subclass of ViewGroup that provides a mechanism to asynchronously display tile-based images, with additional functionality for 2D dragging, flinging, pinch or double-tap to zoom, adding overlaying Views (markers), built-in Hot Spot support, dynamic path drawing, multiple levels of detail, and support for any relative positioning or coordinate system.

The newest version!
package com.qozix.tileview.detail;

import java.util.LinkedList;

import android.graphics.Rect;
import android.util.Log;

import com.qozix.tileview.tiles.Tile;

public class DetailLevel implements Comparable {

	private static final int DEFAULT_TILE_SIZE = 256;

	private double scale;
	
	private int tileWidth = DEFAULT_TILE_SIZE;
	private int tileHeight = DEFAULT_TILE_SIZE;

	private String pattern;
	private String downsample;

	private DetailManager detailManager;
	private Rect viewport = new Rect();

	public DetailLevel( DetailManager zm, float s, String p, String d, int tw, int th ) {
		detailManager = zm;
		scale = s;
		pattern = p;
		downsample = d;
		tileWidth = tw;
		tileHeight = th;
	}
	
	public DetailLevel( DetailManager zm, float s, String p, String d ) {
		this( zm, s, p, d, DEFAULT_TILE_SIZE, DEFAULT_TILE_SIZE );
	}

	public LinkedList getIntersections() {
		
		double relativeScale = getRelativeScale();
		
		int drawableWidth = (int) ( detailManager.getWidth() * getScale() * relativeScale );
		int drawableHeight = (int) ( detailManager.getHeight() * getScale() * relativeScale );
		double offsetWidth = ( tileWidth * relativeScale );
		double offsetHeight = ( tileHeight * relativeScale );
		
		LinkedList intersections = new LinkedList();
		
		viewport.set( detailManager.getComputedViewport() );
		
		// TODO test if mins are right
		viewport.top = Math.max( viewport.top, 0 );
		viewport.left = Math.max( viewport.left, 0 );
		viewport.right = Math.min( viewport.right, drawableWidth );
		viewport.bottom = Math.min( viewport.bottom, drawableHeight );
		
		
		int startingRow = (int) Math.floor( viewport.top / offsetHeight );
		int endingRow = (int) Math.ceil( viewport.bottom / offsetHeight );
		int startingColumn = (int) Math.floor( viewport.left / offsetWidth );
		int endingColumn = (int) Math.ceil( viewport.right / offsetWidth );
		
		DetailLevelPatternParser parser = detailManager.getDetailLevelPatternParser();
		
		for ( int iterationRow = startingRow; iterationRow < endingRow; iterationRow++ ) {
			for ( int iterationColumn = startingColumn; iterationColumn < endingColumn; iterationColumn++ ) {
				String fileName = parser.parse( pattern, iterationRow, iterationColumn );
				int left = iterationColumn * tileWidth;
				int top = iterationRow * tileHeight;
				Tile tile = new Tile( left, top, tileWidth, tileHeight, fileName );
				intersections.add( tile );
			}
		}
		
		
		return intersections;
		
	}

	public double getScale(){
		return scale;
	}
	
	public double getRelativeScale(){
		return detailManager.getScale() / scale;
	}
	
	public int getTileWidth() {
		return tileWidth;
	}

	public int getTileHeight() {
		return tileHeight;
	}

	public String getPattern() {
		return pattern;
	}

	public String getDownsample() {
		return downsample;
	}

	@Override
	public int compareTo( DetailLevel o ) {
		return (int) Math.signum( getScale() - o.getScale() );
	}

	@Override
	public boolean equals( Object o ) {
		if ( o instanceof DetailLevel ) {
			DetailLevel zl = (DetailLevel) o;
			return ( zl.getScale() == getScale() );
		}
		return false;
	}

	@Override
	public int hashCode() {
		long bits = ( Double.doubleToLongBits( getScale() ) * 43 );
		return ( ( (int) bits ) ^ ( (int) ( bits >> 32 ) ) );
	}

	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy