如何为自制Java parallax effect实现灵敏度控制?
给视差效果添加灵敏度控制的解决方案
核心思路
在计算视差偏移量时,引入一个灵敏度系数(取值可自定义,比如0到1之间,值越小移动幅度越平缓;大于1时移动幅度会放大),将原本的偏移量乘以这个系数,就能灵活调节视差移动的幅度。
修改后的完整代码
import java.awt.Dimension; import java.awt.Image; import java.awt.MouseInfo; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingUtilities; public class Main { public static void main(String[] args) { SwingUtilities.invokeLater(() -> new Main()); } public Main() { Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); // 初始化时传入灵敏度系数,这里设为0.3,可按需调整 Parallax parallax = new Parallax(new Point((int) size.getWidth() / 2, (int) size.getHeight() / 2), new Rectangle(0, 0, 1920, 1080), 0.3); JFrame f = new JFrame(); JLabel l = new JLabel(); f.setSize(800, 600); f.setLocationRelativeTo(null); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); try { l.setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsStream("example.jpg")).getScaledInstance(1920, 1080, Image.SCALE_FAST))); } catch (IOException e) { e.printStackTrace(); } f.add(l); f.addMouseMotionListener(new MouseAdapter() { @Override public void mouseMoved(MouseEvent e) { parallax.update(); l.setLocation(parallax.getObject().x, parallax.getObject().y); } }); } public class Parallax { private Point parallaxCenter; private Rectangle object; private double sensitivity; // 存储灵敏度系数 // 构造方法新增灵敏度参数 public Parallax(Point parallaxCenter, Rectangle object, double sensitivity) { this.parallaxCenter = parallaxCenter; this.object = object; this.sensitivity = sensitivity; } public void update() { Point mousePosition = MouseInfo.getPointerInfo().getLocation(); // 计算偏移量时乘以灵敏度系数 int offsetX = (int) ((-mousePosition.x + parallaxCenter.x) * sensitivity); int offsetY = (int) ((-mousePosition.y + parallaxCenter.y) * sensitivity); object.setLocation(offsetX, offsetY); } public Rectangle getObject() { return object; } // 可选:提供动态调整灵敏度的方法 public void setSensitivity(double sensitivity) { this.sensitivity = sensitivity; } } }
关键修改点
- 在
Parallax类中新增sensitivity成员变量,用于控制偏移幅度 - 构造方法新增灵敏度参数,初始化时可传入自定义数值
- 在
update方法中,将计算出的偏移量乘以灵敏度系数后再设置给目标矩形 - 可选添加
setSensitivity方法,支持运行时动态调整灵敏度
效果说明
- 当
sensitivity = 0时,图片完全不移动 - 当
sensitivity = 1时,效果和原代码一致 - 当
0 < sensitivity < 1时,移动幅度缩小,适合轻微视差场景 - 当
sensitivity > 1时,移动幅度放大,适合强烈视差效果
内容的提问来源于stack exchange,提问作者user17820402
相关产品推荐
相关产品推荐

