You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为自制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:13:16