Tachozeiger bewegen!

#1
Hey liebe Community,

ich habe hier eine Grafik, mit einem ganz normalen Tacho und einem Zeiger. Nun möchte ich parallel zu dem Ladevorgang eines Programms den Tachozeiger bewegen.
Ich habe leider gar keine Ahnung wie das gehen soll.. Benutze ich die 2D API von Java?
Muss ich vielleicht doch den Tachozeiger immer ein kleines Stück bewegen und erneut ein Screenshot machen, so dass ich nachher 100 Bilder hab und die dann nacheinander anzeige? Oder kann ich einfach die Werte x und y irgendwie verändern?

grüße coco07
 

Firefall

Well-Known Member
c-b Experte
#2
Also du hast nur ein einzelnes Bild/Foto? Dann wird es ziemlich mühsam. Idealerweise hättest du en Hintergrund und den Zeiger selbst als individuelle Bilder. Kannst du ja vielleicht aus Screenshots zusammenschneiden und herausarbeiten, jenachdem wie das aussieht. Dann zeigst du den Hintergrund an und darauf den Zeiger, den du drehst. Wie es im Detail geht in Java kann ich dir nicht sagen.
 
#3
Ja alter Thread, aber eine mögliche Lösung:

Java:
package test;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Tacho extends JPanel implements Runnable {
   
    private boolean running;
    private BufferedImage background;
    private Needle needle;
   
    public Tacho(){
        background = Tacho.loadImage("tacho.png");
        JFrame f = new JFrame();
        f.setSize(background.getWidth(), background.getHeight());
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.setVisible(true);
        new Thread(this).start();
    }
   
    public void run(){
        long lastFrame = System.nanoTime();
        long thisFrame;
        float delta;
        needle = new Needle(this);
        running = true;
        while(running){
            thisFrame = System.nanoTime();
            delta = thisFrame - lastFrame;
            lastFrame = thisFrame;
            needle.update(delta);
            repaint();
            try{Thread.sleep(10);}catch(Exception e){}
        }
    }
   
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(background, 0, 0, null);
        needle.paint(g);
    }
   
    public static BufferedImage loadImage(String imageName){
        try{
            return ImageIO.read(Tacho.class.getClassLoader().getResourceAsStream(imageName));
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }
   
    public BufferedImage getBackgroundImage(){
        return background;
    }
   
    static class Needle {
       
        private float angle;
        private BufferedImage needleImage;
        private int drawx, drawy;
       
        public Needle(Tacho tacho){
            needleImage = Tacho.loadImage("needle.png");
            drawx = tacho.getBackgroundImage().getWidth() / 2 - needleImage.getWidth() / 2;
            drawy = tacho.getBackgroundImage().getHeight() - needleImage.getHeight();
            angle = -90f;
        }
       
        public void update(float delta){
            angle += 10 * (delta / 1e9);
        }
       
        public void paint(Graphics g){
            Graphics2D g2d = (Graphics2D) g;
            g2d.rotate(Math.toRadians(angle), drawx + needleImage.getWidth() / 2, drawy + needleImage.getHeight());
            g2d.drawImage(needleImage, drawx, drawy, null);
        }
    }
   
    public static void main(String[] args) {
        new Tacho();
    }
}
 
Oben