旋转光标或光标图像Java

时间:2014-08-04 08:14:57

标签: java image rotation cursor degrees

好。所以我试图根据它的位置旋转光标图像或光标本身。我尝试过使用

    Graphics2D g2d = (Graphics2D)g;
    AffineTransform old = g2d.getTransform();
    g2d.rotate(Math.toRadians(degrees));
    Toolkit toolkit = Toolkit.getDefaultToolkit();   //Get the default toolkit  
    Image image = toolkit.getImage("pictures/skills/skill" +InfoReader.SkillData("CastImage") +".png");   //Load an image for the cursor  
    Cursor cursor = toolkit.createCustomCursor(image, new Point(0, 0), "Cursor");
    setCursor(cursor);
    g2d.setTransform(old);

所以我认为这应该旋转图像,但g2d.rotate()doesen似乎对光标有任何影响?我不能100%确定它是否对图像本身有影响。至少光标图像是我想要的。

编辑:这是一个示例视频:)(在我的情况下,我只想围绕某个点旋转它,它始终保持在同一个位置)。 https://www.youtube.com/watch?v=TQ71QXa-B-s

2 个答案:

答案 0 :(得分:0)

我觉得有点混乱,你想要旋转什么?

让我们假设您有一个BufferedImage对象,您可以从中获取Graphics2D对象,并通过对它进行操作,您可能得到您想要的。

java.awt.image.BufferedImage buffImage = null;

try {
    java.io.InputStream imageStream = 
            MyClass.class.getResourceAsStream( "pictures/skills/skill" +InfoReader.SkillData("CastImage") +".png" );
    //MyClass is anyclass that you use as relative path...
    //use ClassLoader.getSystemClassLoader().getResourceAsStream( ... ) 
    //for a absolute path
    buffImage = javax.imageio.ImageIO.read( imageStream );
}
catch ( java.io.IOException | IllegalArgumentException ex ) {
    //It may throw IllegalArgumentException if imageStream is null.
}

Graphics2D g2d = buffImage.createGraphics();
try {
    AffineTransform old = g2d.getTransform();
    g2d.rotate(Math.toRadians(degrees));
    g2d.setTransform(old);
}finally {
    g2d.dispose();
}

Toolkit toolkit = Toolkit.getDefaultToolkit();   //Get the default toolkit  
Cursor cursor = toolkit.createCustomCursor(image, new Point(0, 0), "Cursor");
setCursor(cursor);

现在,如果您打算在使用它时旋转它,我不知道如何,但我希望我有所帮助。

编辑:尝试查看此链接,它可能会对您有所帮助:https://www.google.com/#q=java+rotate+Cursor

编辑2:我现在看到你想要什么,我不知道如何帮助你,但试着看看我给你的链接(是的,它来自谷歌)。即使你找不到多少,也可能对你的任务有所帮助。

答案 1 :(得分:0)

在搜索和询问类似问题的解决方案时,我找到了你的问题,也找到了答案。这是我在我的程序中使用的代码,它的工作原理。请注意,此方法仅被调用一次,并且不断调用它可能需要优化。我今天也学会了AffineTransform,可能会犯一些错误(即使代码有效)。

基本上我旋转图像,从中创建新图像并将新图像设置为光标。 我的“cursor.png”在数据文件夹中。

private void rotateCursor(double rotation) {
    // Get the default toolkit
    Toolkit toolkit = Toolkit.getDefaultToolkit();

    // Load an image for the cursor
    BufferedImage image = null;
    try {
        image = ImageIO.read(this.getClass().getResource("/data/cursor.png"));
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    AffineTransform at = new AffineTransform(); 
    // affineTransform applies the added transformations in the reverse order

    // 3. translate it back to the center of the picture
    at.translate(image.getWidth() / 2, image.getWidth() / 2);

    at.rotate(rotation);//2- adds rotation  to at (they are not degrees)

    //1- translate the object so that you rotate it around the center
    at.translate(-image.getWidth() / 2, -image.getHeight() / 2);

    BufferedImage rotated = null; // creates new image that will be the transformed image

    // makes this: at + image= rotated
    AffineTransformOp affineTransformOp = new AffineTransformOp(at,
            AffineTransformOp.TYPE_BILINEAR);
    image2 = affineTransformOp.filter(image, rotated);

    // Create the hotSpot for the cursor
    Point hotSpot = new Point(10, 0); // click position of the cursor(ex: + shape's is middle)

    Cursor cursor = toolkit.createCustomCursor(rotated, hotSpot, "cursor");

    // Use the custom cursor
    this.setCursor(cursor);

}

如果您使用的是mouseListener,则可以使用window.getMousePosition().x;window.getMousePosition().y;获取鼠标位置。

您需要使用正确的double调用rotateCursor()方法。如何计算正确的双倍是我无法帮助你的。

我希望它有所帮助。

我从这些来源学到了这些:

storing transformed BufferedImage in Java

http://www.codebeach.com/2008/02/using-custom-cursors-in-java.html

Rotating BufferedImage instances

http://stumpygames.wordpress.com/2012/07/22/particles-tutorial-foundation/(本教程还有一个鼠标监听器)