Вращающийся курсор или изображение курсора 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
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()
метод с правильным двойным. Как рассчитать правильный дубль - это то, с чем я не могу вам помочь.
Я надеюсь, что это помогает.
Я узнал это из этих источников:
хранение преобразованного 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/ (в этом руководстве также есть слушатель мыши)
Меня это немного смущает, что вы пытаетесь повернуть?
Давайте представим, что у вас есть объект 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/
РЕДАКТИРОВАТЬ 2: Теперь я вижу, что вы хотите, точно, я не знаю, как вам помочь, но попробуйте увидеть ссылку, которую я дал вам (да, это от Google). Даже если вы не найдете много, это может помочь вам в ваших поисках.