Efeito de Zoom com lupa igual da acessibilidade do windows em Java

10 respostas
A

Saudações a todos,

Estou desenvolvendo um jogo q tem q ter acessibilidade de zoom para pessoas com baixa visão e queria colocar um efeito de lupa como o q tem no windows. Queria saber se alguém já implementou alguma vez alguma coisa parecida, pois já procurei mto na internet e no forúm tb e não consegui achar nada parecido, agradeço a ajuda de quem poder colaborar com informações, materias e qualquer outro tipo de ajuda para q eu possa solucionar este problema. Aceito tb informações e materiais sobre qualquer função de zoom para eu testar.

Atenciosamente,

10 Respostas

V

Se for apenas no seu jogo, é até em simples. O objeto Graphics2D permite que você aplique sobre ele uma transformação do espaço coordenado. A classe AffineTransform já implementa as transformações básicas (Rotação, Translação e Escala).

Então, basta trocar a escala e redesenhar o conteúdo que estaria abaixo do mouse. O Graphics também suporta a definição de um ClipRect, ou seja, da área em que o desenho seria aplicado. Com isso, você pode facilmente definir a janelinha onde o zoom vai atuar.

A

Ok ViniGodoy, vc teria algum material, exemplo ou documentação para q eu possa ver e me basear?

V

http://download.oracle.com/javase/tutorial/2d/advanced/transforming.html
http://www.glyphic.com/transform/
http://www.javalobby.org/java/forums/t19387.html

A

Obrigado Vini, vou dar uma estudada e assim q tiver uma solução posto aqui.
[]'s

A

Achei uma outra forma de trabalhar com o zoom, só q usando o mouse que tb atende minhas necessidades, é parecido com um dos exemplos q vc me mandou, só q ao invés de trabalhar com as formas geométricas queria trabalhar com imagens. Vc saberia como fazer isso?

abaixo segueo código.

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

public class ShapePlayTest {

   private static void createAndShowUI() {
      ShapePlayPanel spPanel = new ShapePlayPanel();
      ShapePlayMouseListener mListener = new ShapePlayMouseListener(spPanel);
      spPanel.addMouseListener(mListener);
      spPanel.addMouseMotionListener(mListener);
      spPanel.addMouseWheelListener(mListener);

      JFrame frame = new JFrame("ShapePlay");
      frame.getContentPane().add(spPanel);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

@SuppressWarnings("serial")
class ShapePlayPanel extends JPanel {
   private static final float STROKE_SIZE = 2;
   private Path2D myPath = new Path2D.Double();

   public ShapePlayPanel() {
      setPreferredSize(new Dimension(400, 400));
      //myPath.append(new Ellipse2D.Double(30, 30, 100, 100), false);
      //myPath.append(new Line2D.Double(250, 350, 350, 250), false);
      //myPath.append(new Line2D.Double(350, 350, 250, 250), false);
     //aqui é onde a forma geométrica é desenhada...
      myPath.append(new RoundRectangle2D.Double(230, 30, 100, 100, 10, 10), false);

   
   }

   public void setAffineTransform(AffineTransform at) {
      myPath.transform(at);
   }

   public boolean contains(Point p) {
      return myPath.contains(p);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

      g2.setColor(Color.blue);
      g2.fill(myPath);

      g2.setColor(Color.red);
      g2.setStroke(new BasicStroke(STROKE_SIZE));
      g2.draw(myPath);
   }

}

class ShapePlayMouseListener extends MouseAdapter {
   private static final double SCALE_RATIO = 10.0 / 9.0;
   private ShapePlayPanel spPanel;
   private Point mousePressedPt = null;

   public ShapePlayMouseListener(ShapePlayPanel spPanel) {
      this.spPanel = spPanel;
   }

   @Override
   public void mousePressed(MouseEvent e) {
      Point p = e.getPoint();
      mousePressedPt = p;
   }

   @Override
   public void mouseReleased(MouseEvent e) {
      mousePressedPt = null;
   }

   @Override
   public void mouseDragged(MouseEvent e) {
      if (mousePressedPt != null) {
         Point p = e.getPoint();
         double tx = p.x - mousePressedPt.x;
         double ty = p.y - mousePressedPt.y;
         spPanel.setAffineTransform(new AffineTransform());
         spPanel.setAffineTransform(AffineTransform.getTranslateInstance(tx, ty));
         spPanel.repaint();

         mousePressedPt = p;
      }
   }

   @Override
   public void mouseWheelMoved(MouseWheelEvent e) {
      Point p = e.getPoint();
      int wheelRotation = e.getWheelRotation();

      // get scale factors based on direction of wheel rotation
      double sx = (wheelRotation > 0) ? SCALE_RATIO : 1 / SCALE_RATIO;
      double sy = sx;

      // get translation factors so that expansion is centered at mouse point
      double tx = p.x * (1 - sx);
      double ty = p.y * (1 - sy);

      AffineTransform at = AffineTransform.getTranslateInstance(tx, ty);
      at.scale(sx, sy);

      spPanel.setAffineTransform(at);
      spPanel.repaint();
   }
}
H
abdneto:
Achei uma outra forma de trabalhar com o zoom, só q usando o mouse que tb atende minhas necessidades, é parecido com um dos exemplos q vc me mandou, só q ao invés de trabalhar com as formas geométricas queria trabalhar com imagens. Vc saberia como fazer isso?

abaixo segueo código.

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

public class ShapePlayTest {

   private static void createAndShowUI() {
      ShapePlayPanel spPanel = new ShapePlayPanel();
      ShapePlayMouseListener mListener = new ShapePlayMouseListener(spPanel);
      spPanel.addMouseListener(mListener);
      spPanel.addMouseMotionListener(mListener);
      spPanel.addMouseWheelListener(mListener);

      JFrame frame = new JFrame("ShapePlay");
      frame.getContentPane().add(spPanel);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

@SuppressWarnings("serial")
class ShapePlayPanel extends JPanel {
   private static final float STROKE_SIZE = 2;
   private Path2D myPath = new Path2D.Double();

   public ShapePlayPanel() {
      setPreferredSize(new Dimension(400, 400));
      //myPath.append(new Ellipse2D.Double(30, 30, 100, 100), false);
      //myPath.append(new Line2D.Double(250, 350, 350, 250), false);
      //myPath.append(new Line2D.Double(350, 350, 250, 250), false);
     //aqui é onde a forma geométrica é desenhada...
      myPath.append(new RoundRectangle2D.Double(230, 30, 100, 100, 10, 10), false);

   
   }

   public void setAffineTransform(AffineTransform at) {
      myPath.transform(at);
   }

   public boolean contains(Point p) {
      return myPath.contains(p);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

      g2.setColor(Color.blue);
      g2.fill(myPath);

      g2.setColor(Color.red);
      g2.setStroke(new BasicStroke(STROKE_SIZE));
      g2.draw(myPath);
   }

}

class ShapePlayMouseListener extends MouseAdapter {
   private static final double SCALE_RATIO = 10.0 / 9.0;
   private ShapePlayPanel spPanel;
   private Point mousePressedPt = null;

   public ShapePlayMouseListener(ShapePlayPanel spPanel) {
      this.spPanel = spPanel;
   }

   @Override
   public void mousePressed(MouseEvent e) {
      Point p = e.getPoint();
      mousePressedPt = p;
   }

   @Override
   public void mouseReleased(MouseEvent e) {
      mousePressedPt = null;
   }

   @Override
   public void mouseDragged(MouseEvent e) {
      if (mousePressedPt != null) {
         Point p = e.getPoint();
         double tx = p.x - mousePressedPt.x;
         double ty = p.y - mousePressedPt.y;
         spPanel.setAffineTransform(new AffineTransform());
         spPanel.setAffineTransform(AffineTransform.getTranslateInstance(tx, ty));
         spPanel.repaint();

         mousePressedPt = p;
      }
   }

   @Override
   public void mouseWheelMoved(MouseWheelEvent e) {
      Point p = e.getPoint();
      int wheelRotation = e.getWheelRotation();

      // get scale factors based on direction of wheel rotation
      double sx = (wheelRotation > 0) ? SCALE_RATIO : 1 / SCALE_RATIO;
      double sy = sx;

      // get translation factors so that expansion is centered at mouse point
      double tx = p.x * (1 - sx);
      double ty = p.y * (1 - sy);

      AffineTransform at = AffineTransform.getTranslateInstance(tx, ty);
      at.scale(sx, sy);

      spPanel.setAffineTransform(at);
      spPanel.repaint();
   }
}

Qual erro você está tendo?

A

jakefrog, erro não tem no código. O que quero saber é se tem como fazer esse código funcionar trabalhando com imagens e não com as formas q estão sendo utilizadas.

V

Tudo o que você fizer após aplicar a transformação terá zoom. Tudo. Isso inclui o desenho de primitivas gráficas ou de imagens.

A

ViniGodoy eu sei q é pedir de mais, é aque até agora não consegui fazer o efeito de zoom no jogo q estou desenvolvendo. tava parado devido a recesso e a outro aplicativo q estava desenvolvendo. só q agora voltei novamente para o jogo. vc não tem nenhum código onde é feito zoom in e zoom out com ou sem botão, tanto faz. o q eu quero é só um exemplo funcionando para eu adaptar e utilizar no meu projeto eu sei q é pedir demais mas devido ao tempo q já ta estourando para entrega tenho q tentar ao máximo resolver. desde já agradeço.
Ficarei no aguardo.

A

Olá a todos, alguém poderia me ajudar. estou querendo fazer o mesmo efeito q está no link abaixo em java

http://www.youtube.com/watch?v=zWbtnV4TupE&feature=player_embedded

Se alguém souber e poder ajudar agradeço.

Atenciosamente,

Criado 15 de dezembro de 2010
Ultima resposta 26 de jan. de 2011
Respostas 10
Participantes 3