1、效果展示

效果展示:

样式图片:

2、代码


import com.tobiasy.applet.pdf.utils.FileUtils;
import com.tobiasy.applet.pdf.utils.ResourceUtils;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;import java.io.File;
import java.io.FileInputStream;public class ImagesViewer extends Application {public static void main(String[] args) {launch(args);}public ImagesViewer() {}public ImagesViewer(String title, String url) {this.title = title;this.url = url;}private static double size = 1;private static double count = 1.0;@Overridepublic void start(Stage primary) {AnchorPane root = new AnchorPane();ScrollPane scrollPane = new ScrollPane();scrollPane.setStyle("-fx-border-color: #ffffff;-fx-background-color: #ffffff;");root.getChildren().add(scrollPane);Image image = new Image(url);double width = image.getWidth();double height = image.getHeight();double percent = 1000 / image.getWidth() < 600 / image.getHeight() ? 1000 / image.getWidth() : 600 / image.getHeight();if (percent < 1) {width = width * percent;height = height * percent;}VBox vBox = new VBox();vBox.setPrefWidth(1000);vBox.setPrefHeight(600);vBox.setAlignment(Pos.CENTER);scrollPane.setContent(vBox);ImageView imageView = new ImageView();imageView.setImage(image);imageView.setFitWidth(width);imageView.setFitHeight(height);vBox.getChildren().add(imageView);size = 1;count = 1;imageView.setOnScroll(event -> {if (event.getDeltaY() > 0) {count = count + 1.0 / 10;size = 1.0 / 200 * (count - 1) * (count - 1) * (count - 1) + 1;imageView.setFitWidth(imageView.getFitWidth() * size);imageView.setFitHeight(imageView.getFitHeight() * size);count++;} else {count = count - 1.0 / 10;double y = 1.0 / 200 * (count - 1) * (count - 1) * (count - 1) + 1;size = y < 0 ? size : y;imageView.setFitWidth(imageView.getFitWidth() / size);imageView.setFitHeight(imageView.getFitHeight() / size);count--;}});Scene scene = new Scene(root);primary.setTitle(title);// 设置软件头部icon
//        File iconFile = ResourceUtils.getIconFile();
//        FileInputStream inputStream = FileUtils.getFileInputStream(iconFile);
//        primary.getIcons().add(new Image(inputStream));primary.setScene(scene);primary.setWidth(1000);primary.setHeight(700);primary.show();}private String title = "图片浏览器";private String url = "https://img.zcool.cn/community/015ede57b04f050000018c1b1409b4.JPG?x-oss-process=image/auto-orient,1";
}

3、核心代码讲解

3.1 图片缩放核心代码

        count = count - 1.0 / 10;double y = 1.0 / 200 * (count - 1) * (count - 1) * (count - 1) + 1;size = y < 0 ? size : y;imageView.setFitWidth(imageView.getFitWidth() / size);imageView.setFitHeight(imageView.getFitHeight() / size);count--;

这是图片缩小核心代码,由第一行可以看出,每次宽度缩小1/10个像素,其次第二行中看到一个三次函数,这是用来降低平滑度的,这里我们先说一下为什么要用它,如果宽度每次缩小1/10,当宽度很小时,图片缩小程度会越来越慢,因此我不想让它按照正比进行缩放,而是想让它随着图片的缩小而越来越快,但是这里的越来越快我们也可以根据需求设置相应的速度,于是我们大概知道了这个函数的图像:

横轴代表代码中的count(图片宽度), 纵轴代表size(放大倍数),由图像可知,当图片宽度被缩小(小于1方向)时,缩得越小,其斜率越大,换言之也就是缩小的越快,同样的道理,放大也是一样的,这样我们就能够顺利解决上面我们碰到的问题了。

3.2 设置软件头部icon

        File iconFile = ResourceUtils.getIconFile();FileInputStream inputStream = FileUtils.getFileInputStream(iconFile);primary.getIcons().add(new Image(inputStream));

首先我们或得到一个File对象,再通过File对象获取到其输入流,再通过输入流创建一个Image对象,最后将Image对象添加到Stage对象中去就好啦。

3.3 计算图片宽高比例

        double width = image.getWidth();double height = image.getHeight();double percent = 1000 / image.getWidth() < 600 / image.getHeight() ? 1000 / image.getWidth() : 600 / image.getHeight();if (percent < 1) {width = width * percent;height = height * percent;}

第三行的计算其实我们就是想得到一个最比例,这个比例刚好将图片放置在1000*600的容器里面,这里为什么要这样做的目的就是为了既适应长>宽的也要适应宽>长的图片,总而言之就是将长大于1000的或者宽大于600的图片进行缩放显示。

3.4 鼠标滚动事件

上面我们说过图片缩放,这里究竟是通过什么操作来实现的呢,其实就是滚动鼠标来实现的,那我们来看看滚动事件触发的函数:

        imageView.setOnScroll(event -> {// 缩放具体逻辑if (event.getDeltaY() > 0) {// 这里是向上滚动滚轮(即放大图片)} else {// 这里是乡下滚动滚轮(即缩小图片)}}

代码已经贴出来了,并且已经加上具体的事件处理了,内部嵌入核心的缩放图片逻辑就好啦。

核心代码除此之外就是其他比较简单的javafx语法了,如果有想继续学习javafx的,请持续关注我的文章,谢谢大家。

赶紧复制代码试试看吧

JavaFX图片浏览并实现缩放相关推荐

  1. 模仿微信朋友圈 图片浏览 js javascript 支持图片预览,滑动切换,双指缩放,图片缓存

    模仿微信朋友圈 图片浏览 js javascript 支持图片预览,滑动切换,双指缩放,图片缓存 2017年08月10日 12:11:38 阅读数:2311 previewImage-mobile 仿 ...

  2. Swift封装图片浏览,多张图片浏览,缩放,gif图片的播放

    封装了一个图片浏览器,实现了图片的浏览,缩放,支持多张图片的浏览缩放,保存到相册等功能 实现功能 1.图片浏览,根据图片的大小适应,浏览长图 2.多张图片左右滑动浏览 3.图片的缩放 4.播放gif图 ...

  3. 移动开发----PhotoView 图片浏览缩放控件

    PhotoView 图片浏览缩放控件 和普通的ImageView一样的使用方法 如使用过程中有任何bug,意见或建议,可邮件给我 bmme@vip.qq.com 下载地址:https://github ...

  4. 23.Qt Quick QML-400行实现一个好看的图片浏览器-支持多个图片浏览、缩放、旋转、滑轮切换图片...

    之前我们已经学习了Image.Layout布局.MouseArea.Button.GroupBox.FileDialog等控件. 所以本章综合之前的每章的知识点,来做一个图片浏览器,笔者使用的Qt版本 ...

  5. 原创“.NET研究”企业级控件库之图片浏览控件

    在上两篇:我介绍了原创企业级控件库之组合查询控件 和原创企业级控件库之大数据量分页控件,受到了很多朋友的支持,给了我很大的动力,在此我特表感谢.有的朋友要求把源码提供上来,我在第一篇就讲了,源码会在我 ...

  6. iOS_“图片浏览选择”功能的编写思路

    最近重新开始练习iOS开发,找感觉. 先做个简单的图片浏览选择功能.不用管是难还是简单,先实现一下. 一.步骤概述 包含三个步骤: 创建页面:图片选择页(collectionView),图片预览页 处 ...

  7. iOS开发——仿微信图片浏览交互的实现(向下拖拽图片退出图片浏览器)

    点击上方"iOS开发",选择"置顶公众号" 关键时刻,第一时间送达! DEMO的github地址:https://github.com/YYProgrammer ...

  8. osx android png图片自动 边,Mac/OSX上超好用的图片浏览工具iSee

    A super fast image browser, browse large size images without latency! 一个超级快的图片浏览器,浏览大图片0卡顿! 支持一键变动态桌 ...

  9. Android之——史上最简单最酷炫的3D图片浏览效果的实现

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48052709 如今,Android开发已经成为移动互联开发领域中一支不可或缺的力量 ...

最新文章

  1. 管理员技术(六): 硬盘分区及格式化、 新建一个逻辑卷、调整现有磁盘的分区、扩展逻辑卷的大小、添加一个swap分区...
  2. mysql 怎么实现组内排名_MySQL 实现排名(分组排名)
  3. 人生没有对与错,只是选择不同
  4. 塞尔达盾反机器人_微软商店惊现《塞尔达传说:旷野之息》!任天堂暗示《喷射战士3》?| Jump简报...
  5. vue 和react
  6. linux 下常用操作命令
  7. Django(ORM常用字段)
  8. rtmp rtsp 区别_鱼胶粉和吉利丁粉的区别
  9. easyUI_rowdata
  10. 奋斗吧,程序员——第二十九章 伤心桥下春波绿,疑是惊鸿照影来
  11. 如何关闭flashhelper的ff新推荐广告弹窗
  12. 用javascript访问操作iframe中的dom对象
  13. 作为一名程序员未来的出路究竟在哪里?
  14. Logistic逻辑回归预测员工离职问题
  15. Windows 7 Boot Updater 如何使用
  16. input file 上传图片及压缩
  17. 铁路 计算机系统维护,成都市计算机学校计算机系统维护就业前景
  18. 人工智障和神经病网络对话--30行python让图灵机器人和茉莉机器人无止尽的瞎扯蛋
  19. 苹果手机无法更新系统问题
  20. 自定义Group,解决Group setVisibility后,子View再次设置setVisibility无效的问题

热门文章

  1. 帐号激活与忘记密码 实例
  2. 如何申请 @msn.com 邮箱
  3. ERROR PythonRunner: Python worker exited unexpectedly (crashed)解决方法
  4. Codeforces 1428E Carrots for Rabbits 贪心
  5. mysql 本日、本周、本月、本年 统计
  6. STC 32位8051单片机来了
  7. Win11自带屏幕录制怎么打开?Win11自带录屏的使用方法
  8. 【ZOJ题目分类】备忘
  9. 个人工作总结(非常实用)
  10. 初学Java(一)Java介绍