Apache License 2.0

项目介绍

panpf/zoomimage 是一个托管在 GitHub 上的开源项目,主要使用 Kotlin 编写,采用 Apache License 2.0 许可证,目前获得 660 个 Star、38 次 Fork。

仓库全名
panpf/zoomimage
开源许可证
Apache License 2.0
Star 数
660
Fork 数
38
未关闭 Issue
3

README 摘要

Translations: 简体中文 ZoomImage is an gesture zoom viewing of images library specially designed for Compose Multiplatform and Android View. It has the following features and functions: Compose Multiplatform. Support for Compose Multiplatform on Android, iOS, macOS Native, JVM desktop, web and other platforms Power. Supports basic functions such as double-click scale, two-finger scale, single-finger scale, mouse wheel…

完整内容见 GitHub 原始 README 或本页 。

常见问题

zoomimage 用什么语言开发?

主要使用 Kotlin 编写,采用 Apache License 2.0 许可证,目前有 660 个 Star。

zoomimage 可以免费商用吗?

仓库采用 Apache License 2.0 许可证,可免费使用与修改,商业使用请遵守许可证条款(例如保留版权声明与许可声明)。

如何获取 zoomimage 的源码?

可以直接克隆仓库:git clone https://github.com/panpf/zoomimage.git,默认分支为 main;安装与运行步骤见仓库 README。

zoomimage 最近还在维护吗?

仓库最近一次更新为 9月28日,当前有 3 个未关闭 Issue;Star 数为 660,可作为社区活跃度的参考。

关于

Image zoom library specially designed for Compose Multiplatform and Android View. Supported scale, pan, locate, rotation, and super-large image subsampling.

描述取自 GitHub 官方 API,中文内容由 GitRead 中文社区 编辑团队整理。

README

logo_image ZoomImage

Platform Platform2 API License version_icon

Translations: 简体中文

ZoomImage is an gesture zoom viewing of images library specially designed for Compose Multiplatform and Android View. It has the following features and functions:

  • Compose Multiplatform. Support for Compose Multiplatform on Android, iOS, macOS Native, JVM desktop, web and other platforms
  • Power. Supports basic functions such as double-click scale, two-finger scale, single-finger scale, mouse wheel scale, keyboard scale, single-finger drag, inertial sliding, and keyboard drag.
  • Locate. Support for locate anywhere in the image and keeping it in the center of the screen
  • Rotate. Supports 0°, 90°, 180°, 270°, 360° rotation of pictures
  • Subsampling. Support for subsampling of very large images to avoid OOM, tile support animation, and sharpness gradients
  • Dynamic scale factor. Automatically calculates the most appropriate double-click scaling factor based on image size and container size
  • Scaling damping. When manually scaled beyond the maximum or minimum scale factor, there is a damped rubber band effect
  • Scroll bar. Supports displaying horizontal and vertical scroll bars to clarify the current scroll position
  • Read Mode. When a long image is displayed in reading mode, the initial state automatically fills the screen, and the user can immediately start reading the image content, eliminating the need for the user to double-click to scale in
  • Exif. Support reading Exif Orientation information and automatically rotating images
  • Image Loader. Provide support for image loaders such as sketch, coil, glide, picasso, etc., and can also customize support for more image loaders

https://github.com/panpf/zoomimage/assets/3250512/f067bed9-24e4-4ab8-a839-0731e155f4ef

Multiplatform support

Function/Platform Android iOS macOS Native JVM Web
Zoom ✅ ✅ ✅ ✅ ✅
Subsampling ✅ ✅ ✅ ✅ ✅
Exif Orientation ✅ ✅ ✅ ✅ ✅
Integrated Sketch ✅ ✅ ✅ ✅ ✅
Integrated Coil ✅ ✅ ✅ ✅ ✅
Integrated Glide ✅ ❌ ❌ ❌ ❌
Integrated Picasso ✅ ❌ ❌ ❌ ❌

Sample App

Download

Published to mavenCentral

${LAST_VERSION}: Download (Not included ‘v’)

Compose multiplatform:

// Integrate Sketch v4+ singleton mode, provides SketchZoomAsyncImage component. (Recommended)
implementation("io.github.panpf.zoomimage:zoomimage-compose-sketch4:${LAST_VERSION}")

// Integrate Sketch v4+ koin mode, provides SketchZoomAsyncImage component. (Recommended)
implementation("io.github.panpf.zoomimage:zoomimage-compose-sketch4-koin:${LAST_VERSION}")

// Integrate Sketch v4+ core, provides SketchZoomAsyncImage component. (Recommended)
implementation("io.github.panpf.zoomimage:zoomimage-compose-sketch4-core:${LAST_VERSION}")

// Integrate Sketch v3 singleton mode, provides SketchZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-compose-sketch3:${LAST_VERSION}")

// Integrate Sketch v3 core, provides SketchZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-compose-sketch3-core:${LAST_VERSION}")

// Integrate Coil v3+ singleton mode, provides CoilZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-compose-coil3:${LAST_VERSION}")

// Integrate Coil v3+ core, provides CoilZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-compose-coil3-core:${LAST_VERSION}")

// Integrate Coil v2 singleton mode, provides CoilZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-compose-coil2:${LAST_VERSION}")

// Integrate Coil v2 core, provides CoilZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-compose-coil2-core:${LAST_VERSION}")

// Provides basic ZoomImage component, does not support network images.
implementation("io.github.panpf.zoomimage:zoomimage-compose:${LAST_VERSION}")

// Support loading images from composeResources folder
implementation("io.github.panpf.zoomimage:zoomimage-compose-resources:${LAST_VERSION}")
Tip 提示

Just choose one according to the image loader you use or your needs.

Only android compose:

// Integrate Glide, provides GlideZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-compose-glide:${LAST_VERSION}")

[!TIP] Why is there no picasso version of the compose ZoomImage component? Because Picasso has officially stated that it will not provide support for compose (Original post here)

Android view:

// Integrate Sketch v4+ singleton mode, provides SketchZoomAsyncImage component. (Recommended)
implementation("io.github.panpf.zoomimage:zoomimage-view-sketch4:${LAST_VERSION}")

// Integrate Sketch v4+ koin mode, provides SketchZoomAsyncImage component. (Recommended)
implementation("io.github.panpf.zoomimage:zoomimage-view-sketch4-koin:${LAST_VERSION}")

// Integrate Sketch v4+ core, provides SketchZoomAsyncImage component. (Recommended)
implementation("io.github.panpf.zoomimage:zoomimage-view-sketch4-core:${LAST_VERSION}")

// Integrate Sketch v3 singleton mode, provides SketchZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-view-sketch3:${LAST_VERSION}")

// Integrate Sketch v3 core, provides SketchZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-view-sketch3-core:${LAST_VERSION}")

// Integrate Coil v3+ singleton mode, provides CoilZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-view-coil3:${LAST_VERSION}")

// Integrate Coil v3+ core, provides CoilZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-view-coil3-core:${LAST_VERSION}")

// Integrate Coil v2 singleton mode, provides CoilZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-view-coil2:${LAST_VERSION}")

// Integrate Coil v2 core, provides CoilZoomAsyncImage component.
implementation("io.github.panpf.zoomimage:zoomimage-view-coil2-core:${LAST_VERSION}")

// Integrate Glide, provides GlideZoomImageView component.
implementation("io.github.panpf.zoomimage:zoomimage-view-glide:${LAST_VERSION}")

// Integrate Picasso, provides PicassoZoomImageView component.
implementation("io.github.panpf.zoomimage:zoomimage-view-picasso:${LAST_VERSION}")

// Provides basic ZoomImageView component, does not support network images.
implementation("io.github.panpf.zoomimage:zoomimage-view:${LAST_VERSION}")
Tip 提示

Just choose one according to the image loader you use or your needs.

R8 / Proguard

ZoomImage’s own obfuscation is already included in aar, but you may also need to add obfuscation configuration for other libraries that depend indirectly

Quickly Started

Compose multiplatform:

// Use basic ZoomImage components
val zoomState: ZoomState by rememberZoomState()
val imageSource = remember {
    val resUri = Res.getUri("files/huge_world.jpeg")
  ImageSource.fromComposeResource(resUri)
}
zoomState.setSubsamplingImage(imageSource)
ZoomImage(
    painter = painterResource(Res.drawable.huge_world_thumbnail),
    contentDescription = "view image",
    modifier = Modifier.fillMaxSize(),
    zoomState = zoomState,
)

// Use SketchZoomAsyncImage component
SketchZoomAsyncImage(
    uri = "https://sample.com/sample.jpeg",
    contentDescription = "view image",
    modifier = Modifier.fillMaxSize(),
)

// Use CoilZoomAsyncImage component
CoilZoomAsyncImage(
    model = "https://sample.com/sample.jpeg",
    contentDescription = "view image",
    modifier = Modifier.fillMaxSize(),
)

[!TIP] The usage of SketchZoomAsyncImage and CoilZoomAsyncImage is the same as their original AsyncImage, except that there is an additional zoomState: ZoomState parameter

Only android compose:

// Use GlideZoomAsyncImage component
GlideZoomAsyncImage(
    model = "https://sample.com/sample.jpeg",
    contentDescription = "view image",
    modifier = Modifier.fillMaxSize(),
)

[!TIP] The usage of GlideZoomAsyncImage is the same as its original GlideImage, except that there is an additional zoomState: ZoomState parameter

Android view:

// Use basis ZoomImageView component
val zoomImageView = ZoomImageView(context)
zoomImageView.setImageResource(R.drawable.huge_world_thumbnail)
zoomImageView.setSubsamplingImage(ImageSource.fromResource(R.raw.huge_world))

// Use SketchZoomAsyncImage component
val sketchZoomImageView = SketchZoomImageView(context)
sketchZoomImageView.loadImage("https://sample.com/sample.jpeg")

// Use CoilZoomImageView component
val coilZoomImageView = CoilZoomImageView(context)
sketchZoomImageView.loadImage("https://sample.com/sample.jpeg")

// Use GlideZoomImageView component
val glideZoomImageView = GlideZoomImageView(context)
Glide.with(this@GlideZoomImageViewFragment)
    .load("https://sample.com/sample.jpeg")
    .into(glideZoomImageView)

// Use PicassoZoomImageView component
val picassoZoomImageView = PicassoZoomImageView(context)
picassoZoomImageView.loadImage("https://sample.com/sample.jpeg")

Document

Samples

You can find the sample code in the examples directory, or you can go to release page download App experience

Change Log

Please review the CHANGELOG file

Test Platform

  • Android: Emulator; Arm64; API 21-34
  • JVM: macOS 26; JDK 17
  • iOS: iPhone 16 Simulator; iOS 18.1
  • macOS Native: Apple Silicon; macOS 26
  • Web: Chrome; 130

Run Sample App

Prepare the environment:

  1. Android Studio: Norwhal+ (2025.1.1+)
  2. JDK: 17+
  3. Use kdoctor to check the running environment and follow the prompts to install the required software
  4. Android Studio installs the Kotlin Multiplatform plugin

Run the sample app:

  1. Clone the project and open it using Android Studio
  2. After synchronization is completed, the Kotlin Multiplatform plug-in will automatically create a running configuration for each platform.
  3. Select the corresponding platform’s running configuration, and then click Run

My Projects

The following are my other open source projects. If you are interested, you can learn about them:

  • sketch: Sketch is an image loading library designed for Compose Multiplatform and Android View. It is powerful and rich in functions. In addition to basic functions, it also supports GIF, SVG, video thumbnails, Exif Orientation, etc.
  • assembly-adapter: A library on Android that provides multi-type Item implementations for various adapters. Incidentally, it also provides the most powerful divider for RecyclerView.
  • sticky-item-decoration: RecyclerView sticky item implementation

License

Apache 2.0. See the LICENSE file for details.

评论

暂无评论