Skip to content

Releases: saket/telephoto

0.15.1

16 Feb 21:15
Compare
Choose a tag to compare

Bug fixes

  • Fixed a bug that prevented double tap and quick zooms from working if a gesture was received before the image was fully loaded

Dependency updates

  • Compose multiplatform 1.7.3

0.15.0

16 Feb 03:07
Compare
Choose a tag to compare

This release introduces a new library for telephoto: Modifier.zoomablePeekOverlay(), a modifier for displaying transient overlaid zoom effect, inspired by Instagram.

AsyncImage(
  modifier = Modifier.zoomablePeekOverlay(…),
  model = "https://example.com/image.jpg",
  contentDescription = "",
)
zoom-overlay-demo.mp4

Other changes

  • Auto-enabled ultra HDR mode for compatible images
  • Customizable over-zoom behavior using OverzoomEffect (example).
  • #9: iOS support for Modifier.zoomable()
  • #118: Added partial support for AVIF images
  • #120: SubSamplingImageSource is no longer sealed. Apps can now display custom content such as PDFs and maps using SubSamplingImage().

Bug fixes

  • #114: Fixed flicker in ZoomableImage() when a new image is loaded
  • #122: Fixed a bug where images stopped loading under system stress
  • #129, #110: Worked around crashes related to color spaces in Compose UI

Dependency updates

  • Compose multiplatform: 1.7.1
  • Compile SDK: 35
  • Kotlin: 2.1.0

0.14.0

13 Nov 22:36
Compare
Choose a tag to compare

New changes

Bug fixes

  • #95: Removed explicit recycling of bitmap decoders
  • #97: Added protection against NaN velocities
  • #99: Added handling for non-existent content URIs to prevent crashes
  • #110: Added workaround for a Compose UI issue with unknown color spaces
  • ZoomableImage() will now display its contentDescription even if the image isn't loaded yet
  • Content alignment can now be updated even if the image is zoomed in
  • Prevented multiple buffering of SubSamplingImageSource.rawSource()

Deprecations

  • ZoomableContentLocation#size() is no longer used
  • SubSamplingImageState#isImageLoadedisImageDisplayed
  • SubSamplingImageState#isImageLoadedInFullQualityisImageDisplayedInFullQuality
  • ZoomableState#setContentLocation()setContentLocationSynchronously()

0.13.0

22 Aug 03:21
Compare
Choose a tag to compare

Bug fixes

  • #94: Sub-sampling does not work for images smaller than the minimum tile size in height
  • #95: IllegalStateException: getWidth called on recycled region decoder
  • #96: IllegalStateException: another transformation is already in progress

0.12.1

20 Jul 05:50
Compare
Choose a tag to compare

New changes

Bug fixes

  • Fixed a bug that prevented back buttons from working when ZoomableImage() was focused.

0.12.0

13 Jul 20:08
Compare
Choose a tag to compare

New changes

  • #78: Support for keyboard and mouse shortcuts (by @evant)
  • #67: New APIs in ZoomableState for controlling zoom from code: panBy, zoomBy, and zoomTo
  • #32: New onDoubleClick parameters in ZoomableImage() and Modifier.zoomable() for customizing double-click behavior
  • #91: Reduced minSdk to 21 (by @iwb-florien-flament)
  • Significantly reduced the amount of work required by a ZoomableImageSource by offloading the detection of bad content URIs to SubSamplingImageSource.contentUriOrNull()

Bug fixes

  • #93: NullPointerException when an image is zoomed before it is initialized
  • #50: FileNotFoundException: No content provider when disk caching of an image is disabled using Cache-Control HTTP headers.
  • Fixed infinite reloading of images when unstable image request listener are used in ZoomableAsyncImage(). This removes the need for using remember with ImageRequest.listener and ImageRequest.placeholder values.

0.11.2

28 Apr 06:51
Compare
Choose a tag to compare

Bug fixes

  • #84: Fixed an issue causing placeholders to sometimes take up the full screen (by @rharter)
  • #37: Prevent a crash in ZoomableAsyncImage() after the app's disk cache is cleared
  • #83: Correctly display single-frame GIFs

New changes

  • Increase memory cache hit rate with Coil by using Precision.INEXACT

0.10.0

14 Apr 19:24
Compare
Choose a tag to compare

Bug fixes

  • #70, #72: Correctly update ZoomableState when Modifier.zoomable() is reused
  • #71: Make sure velocity tracker tracks the same pointer
  • #81: Read maximum fling velocity from composition locals

Dependency updates

  • Compose compiler: 1.5.11
  • Compose UI: 1.6.4
  • Compose multiplatform: 1.6.4

0.9.0

25 Mar 22:58
Compare
Choose a tag to compare

Bug fixes

  • #70, #72: Zoomable modifier loses state after ZoomableState gets disposed and recreated

Dependency updates

  • Compose compiler: 1.5.10
  • Compose UI: 1.6.3
  • Compose multiplatform: 1.6.1

0.8.0

18 Feb 06:13
Compare
Choose a tag to compare

Breaking changes

  • Reordered SubSamplingImage()'s parameters to move Modifier below all required parameters.

New changes

  • Update Compose UI to 1.6.1 and Compose Multiplatform to 1.6.0-rc02
  • Introduced ZoomableState#transformedContentBounds for observing transformed content bounds. This can be used for drawing decorations around the content or performing hit tests.
  • Placeholder images now respond to click listeners. Additionally, they will swallow all other zoom gestures instead of ignoring them.
  • #3: Read color space of bitmaps from Coil and Glide.

Bug fixes

  • #60, #65: Improved detection of pinch-to-zoom gestures.
  • #8: Composables with Modifier.zoomable() are now drawn on the first frame. This fixes their broken layout preview.
  • #58: Fixed a resource leak when an image's EXIF metadata is read.
  • ZoomableState#resetZoom() now calculates the content's position on the same UI frame.
  • Images no longer flicker on start when they can't zoom-in any further.