首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何保持鼠标相对于屏幕的位置而忽略组件旋转?

如何保持鼠标相对于屏幕的位置而忽略组件旋转?
EN

Stack Overflow用户
提问于 2017-12-06 04:00:03
回答 0查看 166关注 0票数 2

当旋转应用到画布上时,如何旋转鼠标坐标系?当我旋转画布时,鼠标相对于旋转的组件保持在相同的位置。我想让鼠标坐标考虑组件的旋转,而不是坐标相对于窗口的位置,而不考虑旋转。

我提供了一张图片来说明我想要表达的更多内容。黑色框表示用于参考的形状,紫色框位于鼠标坐标上。Rotation example image

最左边的图片-未旋转的画布中间图片-旋转的画布,因为Java看到它最右边的图片-所需的结果

我的示例代码模拟通过按向左或向右箭头键旋转的画布。此模拟显示鼠标如何相对于旋转的组件停留在某个位置,而不是相对于屏幕上的鼠标。

有没有一种方法可以转换或计算这些新的坐标(显示在最右边的图像中),以便它们在窗口中锁定到我的鼠标上,而不考虑旋转?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 package rotation;

    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.MouseInfo;
    import java.awt.Point;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferStrategy;

    import javax.swing.JFrame;

    @SuppressWarnings("serial")
    public class RotationExample extends Canvas implements Runnable{

        boolean isRunning = false;
        boolean left = false;
        boolean right = false;
        AffineTransform transform = new AffineTransform();
        double rotation = 0.0d;

        public RotationExample() {
            //Create jframe
            JFrame f = new JFrame();
            f.setSize(500, 500);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setResizable(false);
            f.setUndecorated(true);

            //Add key listener
            this.addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent e) {
                    int k = e.getKeyCode();
                    //Set left and right variables
                    if(k == KeyEvent.VK_LEFT) left = true;
                    if(k == KeyEvent.VK_RIGHT) right = true;
                }

                public void keyReleased(KeyEvent e) {
                    int k = e.getKeyCode();
                    if(k == KeyEvent.VK_LEFT) left = false;
                    if(k == KeyEvent.VK_RIGHT) right = false;
                }
            });

            f.add(this);
            f.setVisible(true);
            start();
        }

        public void render() {
            BufferStrategy bs = this.getBufferStrategy();
            if(bs == null){
                this.createBufferStrategy(3);
                return;
            }

            Graphics g = bs.getDrawGraphics();
            Graphics2D gt = (Graphics2D) g;

            gt.setTransform(transform);

            gt.clearRect(0, 0, 500, 500);

            //Increment rotation based on left or right variables
            if(left) rotation += 0.001;
            else if(right) rotation -= 0.001;

            //Rotate around middle of frame
            gt.rotate(rotation, 250, 250);

            //Draw black rectangle in middle
            gt.setColor(Color.BLACK);
            gt.fillRect(175, 175, 150, 150);

            //Draw red up arrow
            gt.setColor(Color.RED);
            gt.fillPolygon(new int[] {250, 300, 270, 270, 230, 230, 200}, new int[] {200, 250, 250, 300, 300, 250, 250}, 7);

            //Draw rectangle at mouse coordinates
            gt.setColor(Color.MAGENTA);
            Point m = MouseInfo.getPointerInfo().getLocation();
            gt.fillRect((int) m.getX() - 8, (int) m.getY() - 8, 16, 16);

            bs.show();
            gt.dispose();
        }

        public static void main(String[] args) {
            new RotationExample();
        }

        public void start() {
            isRunning = true;
            new Thread(this).start();
        }

        public void run() {
            //Continuous rendering
            while(isRunning) {
                render();
            }

        }
    }
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47666557

复制
相关文章
实现盒子宽度随鼠标位置而改变
当鼠标在拖动线(drag-line)区域内按下时,监听鼠标移动,获取鼠标移动的实时距离 将这个距离加上leftCategory本来的宽度,就是leftCategory随着鼠标移动的宽度
切图仔
2022/09/08
9980
如何保持Android设备屏幕常亮?
在做客户端UI自动化测试或者Monkey自动化测试中,使用jenkins中持续集中测试,经常会遇到因为设备原因导致执行任务失败的Case。
测试加
2022/12/05
4.5K0
如何保持Android设备屏幕常亮?
IOS5开发-控件位置适应屏幕旋转代码
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toOrientation                                  duration:(NSTimeInterval)duration {     if (toOrientation == UIInterfaceOrientationLandscapeLeft ||         toOrientation == UIInterfaceOrientat
阿新
2018/04/12
1.4K0
iOS屏幕旋转
UIInterfaceOrientation方向枚举: UIInterfaceOrientationPortrait //home健在下 UIInterfaceOrientationPortraitUpsideDown //home健在上 UIInterfaceOrientationLandscapeLeft //home健在左 UIInterfaceOrientationLandscapeRight //home健在右 旋转屏幕时触发的函数: //旋转方向发生改变时 -(void)willAnim
且行且珍惜_iOS
2018/05/22
1.7K0
iOS屏幕旋转处理
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 被调用。这个方法是发生在翻转开始之前。一般用来禁用某些控件或者停止某些正在进行的活动,比如停止视频播放。 再来是
ppppy
2022/11/15
7640
用代码旋转屏幕
代码 1 btnRotate.setOnClickListener(new OnClickListener() {  2             @Override  3             public void onClick(View v) {  4                 int r = Math.abs(getRequestedOrientation());  5                 Log.d("DEBUG",Integer.toString(r));  6       
用户3135539
2018/09/12
1.5K0
使用ContentObserver观察屏幕旋转
http://blog.csdn.net/qinjuning/article/details/7047607
望天
2018/08/02
7030
屏幕旋转时调用PopupWindow update方法更新位置失效的问题及解决方案
用户1155943
2018/01/04
1.9K0
屏幕旋转时调用PopupWindow update方法更新位置失效的问题及解决方案
屏幕旋转时调用PopupWindow update方法更新位置失效的问题及解决方案
   接到一个博友的反馈,在屏幕旋转时调用 PopupWindow 的 update 方法失效。使用场景如下:在一个 Activity 中监听屏幕旋转事件,在Activity主布局文件中有个按钮点击弹出一个 PopupWindow,另外在主布局文件中有个 ListView。测试结果发现:如果 ListView 设置为可见(visibile)的话,屏幕旋转时调用的 update 方法无效,如果 ListView 设置为不可见(gone)或者直接删除的话,屏幕旋转时调用的update方法就生效。下面先展示两种情况的效果图对比。
用户1155943
2018/07/31
1.2K0
屏幕旋转时调用PopupWindow update方法更新位置失效的问题及解决方案
零基础入门 32:修改组件的位置.宽高.旋转.缩放
已经不止一两个同学来问过我这个问题了,如何修改一个组件的位置啊,宽高啊,旋转啊,缩放啊之类的问题,鉴于好多同学都有这个疑问,我就单独把他抽出一个小分享内容列出来。
韩东吉
2018/10/19
5730
零基础入门 32:修改组件的位置.宽高.旋转.缩放
canvas 鼠标位置缩放图形
最近再做 webcad , 需要在 canvas  上对图形进行缩放,主要分为以下几个步骤:
用户2434869
2019/02/25
1.7K0
JS魔法堂:关于元素位置和鼠标位置的属性
一、关于鼠标位置的属性                           1. 触发鼠标事件的区域       盒子模型中的border,padding,content区域会触发鼠标事件,点击margin区域将不触发鼠标事件。   2. 鼠标事件对象MouseEvent下的属性       [a].  evt.pageX/Y :以页面左上角为参考点,表示当前触发点离页面左上角的水平和垂直距离。       注意:1. IE5.5~8不支持该属性,polyfill方法pageX = clientX + s
^_^肥仔John
2018/01/18
5.8K0
JS魔法堂:关于元素位置和鼠标位置的属性
C++获取鼠标位置及全局检测鼠标行为
1、获取鼠标位置(在屏幕的位置)    CPoint m_mouse;       GetCursorPos(&m_mouse); 2、 屏幕转化为客户端(控件的相对位置)& 客户端位置转化为屏幕位置       ClientToScreen(this->m_hwnd,m_mouse);  //客户端位置转化为屏幕位置       ScreenToClient(this->m_hwnd,m_mouse) ;  //屏幕转化为客户端 3、获取控件关于在屏幕的位置    CRect  rc     GetWin
Gxjun
2018/03/26
3.9K0
js获取鼠标当前位置坐标
chrome和safari一条龙通杀!完全支持所有属性.其中(offsetX和layerX都是以border为参考点)
OECOM
2020/07/01
14.8K0
React技巧获取鼠标坐标位置
原文链接:https://bobbyhadz.com/blog/react-get-mouse-position[1]
chuckQu
2022/08/19
2.3K0
React技巧获取鼠标坐标位置
Cinemachine(一)VirtualCamera和Brain的简单介绍「建议收藏」
在游戏中,摄像头的效果是非常重要的,将会直接影响到呈现在玩家眼中的画面,好的效果可以直接提高玩家的游戏体验,给予一种身临其境的感觉。例如在一个FPS游戏中,我们往往需要摄像头跟随我们的角色,做一些第一人称第三人称的切换,当角色进入室内时需要调整摄像头位置来防止被墙挡住,在使用倍镜时需要摄像头观察远处的画面等等。以为要实现这些效果我们需要编写很多的控制代码来控制我们的Camera,然而再有了Cinemachine之后,一切都会变得简单起来。
全栈程序员站长
2022/09/01
6.9K0
js获取DOM元素相对于浏览器窗口的位置
Internet Explorer自从您可能关心就一直支持此功能,并且最终在CSSOM视图中对其进行了标准化。 很久以前,所有其他浏览器都采用了它。
IT工作者
2022/01/17
5.6K0
three.js鼠标控制物体旋转
当我们需要固定场景背景,固定摄像机的时候。移动旋转物体可以使用Three.js提供的OrbitControls.js,也可以手动写控制器。
tianyawhl
2019/06/11
15.7K0
点击加载更多

相似问题

找到鼠标相对于控件的位置,而不是屏幕。

39

相对于鼠标位置旋转对象

12

相对于正交相机而不是屏幕的LibGdx鼠标位置

22

屏幕旋转时保持图片位置

12

JavsScript -鼠标相对于屏幕中部的位置

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文