Class ZoomableImageView

java.lang.Object
de.kaffeemitkoffein.tinyweatherforecastgermany.ZoomableImageView

public class ZoomableImageView extends Object
ZoomableImageView is a simple class that enhances an ImageView with the capability to zoom in and out.
Author:
Pawel Dube

Requirements and limitations:

  • the imageview has to be populated with a bitmap. Other content will not work.
  • WIDTH AND HEIGHT OF THE IMAGEVIEW MUST BE SET TO "MATCH_PARENT". When set to "wrap_content", the view will shrink when the bitmap inside the view shrinks due to zooming!

Gestures:

this class catches the usual "zoom in" and "zoom out" gestures:
  • zoom in = move two pointers (e.g. two fingers) away from each other while touching the screen
  • zoom out = move two pointers (e.g. two fingers) closer to each other while touching the screen

moving one pointer (e.g. one finger) while touching the screen moves the scaled bitmap within the imageview

Notes:

  • this class always "consumes" the provided motionEvent, because the underlying ScaleGestureDetector does so. Therefore, there are NEVER any "unused" events after this class has been called. However, this is not a limitation, see example how to use.

How to use:

  1. create an instance of ZoomableImageView providing Context, the imageview and the bitmap,
  2. and optionally override "onGestureFinished" to catch the results once a gesture is done. If you do not need to further react after a zoom/move gesture, you can skip this.
  3. Register an OnTouchListerner and handle over the motionEvent to the ZoomableImageView.

That's all.


mapImageView = (ImageView) findViewById(R.id.map); zoomableImageView = new ZoomableImageView(getApplicationContext(),mapImageView,BitmapFactory.decodeResource(getResources(),R.drawable.germany_nc,null)){
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static class 
    Static class that holds values how to fix a sprite to the underlying bitmap.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    float
     
    float
     
    float
    Default min.
    float
    Default max.
    float
    The current zoom:
    1 = no zoom,
    values below 1 mean the bitmap is zoomed in (enlarged)
    values above 1 mean the bitmap is zoomed out (shrunk).
    Values above 1 are discouraged and may lead to unexpected behaviour of the imageview/bitmap.
    ScaleGestureDetector
     
    static final String
     
    static final String
     
    static final String
     
    RectF
    Holds the borders of the visible area of the bimap.
    float
    The current focus (=center) visible.
    float
     
    de.kaffeemitkoffein.tinyweatherforecastgermany.ZoomableImageView.ZoomGestureListener
     
  • Constructor Summary

    Constructors
    Constructor
    Description
    ZoomableImageView(Context context, ImageView imageView, Bitmap bitmap_src)
    Initializes this class.
    ZoomableImageView(Context context, ImageView imageView, Bitmap bitmap_src, boolean fillViewPort)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    int
    addSpite(Bitmap bitmap, float x, float y, int fixpoint, Float sf)
    Sprite concept: a "sprite" is a small bitmap/icon that is fixed to an absolute position on top of the underlying bitmap.
    float
    Returns the current focus as a relative position, returns a value between 0 (=left border of the bitmap) and 1 (=right border of the bitmap).
    float
    Returns the current focus as a relative position, returns a value between 0 (=left top of the bitmap) and 1 (=bottom of the bitmap).
    float
    Returns the absolute focus x coordinate in pixels.
    float
    Returns the absolute focus y coordinate in pixels.
    void
    onGestureFinished(float scaleFactor, float lastPressX, float lastPressY, float xFocus, float yFocus, float xFocusRelative, float yFocusRelative, RectF currentlyVisibleArea)
    Always called when a gesture (zoom or movement) finished.
    Override this method to do something once a zoom / movement inside the imageview finished.
    The focus is the visible center coordinate.
    void
    onLongPress(float scaleFactor, float lastPressX, float lastPressY, float xFocus, float yFocus, float xFocusRelative, float yFocusRelative, RectF currentlyVisibleArea)
     
    boolean
    onTouchEvent(MotionEvent motionEvent)
    Use this method to supply all motionEvents from the imageview to this class.
    void
    Redraws the bitmap inside the imageview.
    void
    restoreZoomViewState(Bundle zoomViewState)
     
    void
    restoreZoomViewState(Bundle zoomViewState, boolean redraw)
     
    Bundle
     
    void
    setScaleRange(float min, float max)
    Optional method to set the min and max scale range.
    Example: setScaleRange(0.25,1); sets a maximum zoom in of 4x and a maximum zoom out to the original size.
    void
    updateBitmap(Bitmap newbitmap)
    Updates the bitmap with a new one.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • scaleFactor

      public float scaleFactor
      The current zoom:
      1 = no zoom,
      values below 1 mean the bitmap is zoomed in (enlarged)
      values above 1 mean the bitmap is zoomed out (shrunk).
      Values above 1 are discouraged and may lead to unexpected behaviour of the imageview/bitmap.

      Notice: this value is only accurate once a scale gesture finished. During a scale gesture, it holds the scale factor from the beginning of the gesture. In other words: it is updated at the end of the gesture, and not while a gesture is being performed.

      Override onGestureFinished to get the results of a gesture.

    • xFocus

      public float xFocus
      The current focus (=center) visible. Both variables refer to the x/y coordinates of the underlying bitmap.
    • yFocus

      public float yFocus
    • minScaleRange

      public float minScaleRange
      Default max. zoom factor, 0.25f = 4x zoom.
    • maxScaleRange

      public float maxScaleRange
      Default min. zoom factor, values above 1 are discouraged.
    • temporaryVisibleArea

      public RectF temporaryVisibleArea
      Holds the borders of the visible area of the bimap. May be null before first gestures.
    • lastPressX

      public float lastPressX
    • lastPressY

      public float lastPressY
    • zoomGestureListener

      public de.kaffeemitkoffein.tinyweatherforecastgermany.ZoomableImageView.ZoomGestureListener zoomGestureListener
    • scaleGestureDetector

      public ScaleGestureDetector scaleGestureDetector
    • STATE_SCALEFACTOR

      public static final String STATE_SCALEFACTOR
      See Also:
    • STATE_XFOCUS

      public static final String STATE_XFOCUS
      See Also:
    • STATE_YFOCUS

      public static final String STATE_YFOCUS
      See Also:
  • Constructor Details

    • ZoomableImageView

      public ZoomableImageView(Context context, ImageView imageView, Bitmap bitmap_src)
      Initializes this class. Values must not be null.
      Parameters:
      context - the application context
      imageView - the imageview
      bitmap_src - the bitmap to be used in the imageview
    • ZoomableImageView

      public ZoomableImageView(Context context, ImageView imageView, Bitmap bitmap_src, boolean fillViewPort)
  • Method Details

    • setScaleRange

      public void setScaleRange(float min, float max)
      Optional method to set the min and max scale range.
      Example: setScaleRange(0.25,1); sets a maximum zoom in of 4x and a maximum zoom out to the original size.
      Parameters:
      min - the max. zoom, must be lower than max (e.g. 0.25 means a max. zoom of 4x).
      max - the min. zoom, typically 1 (original size). Values above 1 are discouraged.
    • updateBitmap

      public void updateBitmap(Bitmap newbitmap)
      Updates the bitmap with a new one. If the old and new bitmap have the same width and height, the current zoom values and the focus are preserved.
      Parameters:
      newbitmap - the new bitmap, must not be null
    • addSpite

      public int addSpite(Bitmap bitmap, float x, float y, int fixpoint, Float sf)
      Sprite concept: a "sprite" is a small bitmap/icon that is fixed to an absolute position on top of the underlying bitmap. When the underlying bitmap gets zoomed in or out, the sprite does NOT zoom but always keeps the same size. It remains at the same (relative) position fixed to the underlying bitmap. Got it? Adds a sprite.
      Parameters:
      bitmap - the bitmap holding the sprite. May not be null.
      x - x-position (on the underlying bitmap) where to fix the sprite
      y - y-position (on the underlying bitmap) where to fix the sprite
      fixpoint - how to fix the sprite, see SPRITEFIXPOINT class
      Returns:
      number of the sprite
    • onGestureFinished

      public void onGestureFinished(float scaleFactor, float lastPressX, float lastPressY, float xFocus, float yFocus, float xFocusRelative, float yFocusRelative, RectF currentlyVisibleArea)
      Always called when a gesture (zoom or movement) finished.
      Override this method to do something once a zoom / movement inside the imageview finished.
      The focus is the visible center coordinate.
      Parameters:
      scaleFactor - the current scale factor
      lastPressX - the absolute x of last pointer/touch, reference is the whole bitmap
      lastPressY - the absolute y of last pointer/touch, reference is the whole bitmap
      xFocus - the absolute x focus in pixels, reference is the whole bitmap
      yFocus - the absolute y focus in pixels, reference is the whole bitmap
      xFocusRelative - the relative x focus (0 <= xFocusRelative <= 1), reference is the whole bitmap
      yFocusRelative - the relative y focus (0 <= yFocusRelative <= 1), reference is the whole bitmap
      currentlyVisibleArea - rectangle holding the coordinates of the visible area in pixels
    • onLongPress

      public void onLongPress(float scaleFactor, float lastPressX, float lastPressY, float xFocus, float yFocus, float xFocusRelative, float yFocusRelative, RectF currentlyVisibleArea)
    • getRelativeXFocus

      public float getRelativeXFocus()
      Returns the current focus as a relative position, returns a value between 0 (=left border of the bitmap) and 1 (=right border of the bitmap). The position refers to the bitmap.
      The focus is the visible center coordinate.
      Returns:
      the relative x coordinate of the focus, 0 <= x <= 1
    • getRelativeYFocus

      public float getRelativeYFocus()
      Returns the current focus as a relative position, returns a value between 0 (=left top of the bitmap) and 1 (=bottom of the bitmap). The position refers to the bitmap.
      The focus is the visible center coordinate.
      Returns:
      the relative y coordinate of the focus, 0 <= y <= 1
    • getXFocus

      public float getXFocus()
      Returns the absolute focus x coordinate in pixels. The coordinate refers to the bitmap size in pixels.
      The focus is the visible center coordinate.
      Returns:
      absolute x coordinate
    • getYFocus

      public float getYFocus()
      Returns the absolute focus y coordinate in pixels. The coordinate refers to the bitmap size in pixels.
      The focus is the visible center coordinate.
      Returns:
      absolute y coordinate
    • onTouchEvent

      public boolean onTouchEvent(MotionEvent motionEvent)
      Use this method to supply all motionEvents from the imageview to this class. This is typically called from an OnTouchListener that is attached to the imageview. See example above.
      Parameters:
      motionEvent -
      Returns:
      if the motionEvent was used, always returns TRUE.
    • redrawBitmap

      public void redrawBitmap()
      Redraws the bitmap inside the imageview. Uses the currently set scale factor.
    • saveZoomViewState

      public Bundle saveZoomViewState()
    • restoreZoomViewState

      public void restoreZoomViewState(Bundle zoomViewState)
    • restoreZoomViewState

      public void restoreZoomViewState(Bundle zoomViewState, boolean redraw)