Поворот курсора или изображения курсора Java

Хорошо. Итак, я пытаюсь повернуть изображение курсора или сам курсор в зависимости от его положения. Я пробовал использовать

    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 (), похоже, не влияет на курсор? Я не уверен на 100%, влияет ли это на само изображение. По крайней мере, изображение курсора - это то, что я хочу.

РЕДАКТИРОВАТЬ: вот пример видео :) (В моем случае я просто хочу повернуть его вокруг определенной точки, которая все время остается на одном месте). https://www.youtube.com/watch?v=TQ71QXa-B-s


person user3738243    schedule 04.08.2014    source источник


Ответы (2)


Пытаясь найти решение подобной проблемы, я нашел ваш вопрос и ответ на него. Это код, который я использую в своей программе, и он работает. Обратите внимание, что этот метод был разработан для однократного вызова, и его постоянный вызов может потребовать оптимизации. Также я изучил 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);

}

Вы можете использовать window.getMousePosition().x; и window.getMousePosition().y; для получения позиции мыши, если вы используете mouseListener.

Вам нужно вызвать метод rotateCursor() с правильным double. Как рассчитать правильный дубль - это то, с чем я не могу вам помочь.

Я надеюсь, что это помогает.

Я узнал об этом из этих источников:

сохранение преобразованного BufferedImage в Java

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

Вращение экземпляров BufferedImage

http://stumpygames.wordpress.com/2012/07/22/particles-tutorial-foundation/ (в этом руководстве также есть прослушиватель мыши)

person WVrock    schedule 21.10.2014

Меня это немного сбивает с толку, что вы пытаетесь повернуть?

Допустим, у вас есть объект 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: теперь я вижу, что вы хотите именно так, я не знаю, как вам помочь, но попробуйте увидеть ссылку, которую я вам дал (да, это из Google). Даже если вы не найдете много, это может помочь вам в ваших поисках.

person saclyr    schedule 04.08.2014