Efeito de Zoom com lupa igual da acessibilidade do windows em Java
10 respostas
A
abdneto
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.
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
abdneto
Ok ViniGodoy, vc teria algum material, exemplo ou documentação para q eu possa ver e me basear?
Obrigado Vini, vou dar uma estudada e assim q tiver uma solução posto aqui.
[]'s
A
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.
importjava.awt.*;importjava.awt.event.*;importjava.awt.geom.*;importjavax.swing.*;publicclassShapePlayTest{privatestaticvoidcreateAndShowUI(){ShapePlayPanelspPanel=newShapePlayPanel();ShapePlayMouseListenermListener=newShapePlayMouseListener(spPanel);spPanel.addMouseListener(mListener);spPanel.addMouseMotionListener(mListener);spPanel.addMouseWheelListener(mListener);JFrameframe=newJFrame("ShapePlay");frame.getContentPane().add(spPanel);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.pack();frame.setLocationRelativeTo(null);frame.setVisible(true);}publicstaticvoidmain(String[]args){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){createAndShowUI();}});}}@SuppressWarnings("serial")classShapePlayPanelextendsJPanel{privatestaticfinalfloatSTROKE_SIZE=2;privatePath2DmyPath=newPath2D.Double();publicShapePlayPanel(){setPreferredSize(newDimension(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(newRoundRectangle2D.Double(230,30,100,100,10,10),false);}publicvoidsetAffineTransform(AffineTransformat){myPath.transform(at);}publicbooleancontains(Pointp){returnmyPath.contains(p);}@OverrideprotectedvoidpaintComponent(Graphicsg){super.paintComponent(g);Graphics2Dg2=(Graphics2D)g;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);g2.setColor(Color.blue);g2.fill(myPath);g2.setColor(Color.red);g2.setStroke(newBasicStroke(STROKE_SIZE));g2.draw(myPath);}}classShapePlayMouseListenerextendsMouseAdapter{privatestaticfinaldoubleSCALE_RATIO=10.0/9.0;privateShapePlayPanelspPanel;privatePointmousePressedPt=null;publicShapePlayMouseListener(ShapePlayPanelspPanel){this.spPanel=spPanel;}@OverridepublicvoidmousePressed(MouseEvente){Pointp=e.getPoint();mousePressedPt=p;}@OverridepublicvoidmouseReleased(MouseEvente){mousePressedPt=null;}@OverridepublicvoidmouseDragged(MouseEvente){if(mousePressedPt!=null){Pointp=e.getPoint();doubletx=p.x-mousePressedPt.x;doublety=p.y-mousePressedPt.y;spPanel.setAffineTransform(newAffineTransform());spPanel.setAffineTransform(AffineTransform.getTranslateInstance(tx,ty));spPanel.repaint();mousePressedPt=p;}}@OverridepublicvoidmouseWheelMoved(MouseWheelEvente){Pointp=e.getPoint();intwheelRotation=e.getWheelRotation();// get scale factors based on direction of wheel rotationdoublesx=(wheelRotation>0)?SCALE_RATIO:1/SCALE_RATIO;doublesy=sx;// get translation factors so that expansion is centered at mouse pointdoubletx=p.x*(1-sx);doublety=p.y*(1-sy);AffineTransformat=AffineTransform.getTranslateInstance(tx,ty);at.scale(sx,sy);spPanel.setAffineTransform(at);spPanel.repaint();}}
H
Hebert_Coelho
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.
importjava.awt.*;importjava.awt.event.*;importjava.awt.geom.*;importjavax.swing.*;publicclassShapePlayTest{privatestaticvoidcreateAndShowUI(){ShapePlayPanelspPanel=newShapePlayPanel();ShapePlayMouseListenermListener=newShapePlayMouseListener(spPanel);spPanel.addMouseListener(mListener);spPanel.addMouseMotionListener(mListener);spPanel.addMouseWheelListener(mListener);JFrameframe=newJFrame("ShapePlay");frame.getContentPane().add(spPanel);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.pack();frame.setLocationRelativeTo(null);frame.setVisible(true);}publicstaticvoidmain(String[]args){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){createAndShowUI();}});}}@SuppressWarnings("serial")classShapePlayPanelextendsJPanel{privatestaticfinalfloatSTROKE_SIZE=2;privatePath2DmyPath=newPath2D.Double();publicShapePlayPanel(){setPreferredSize(newDimension(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(newRoundRectangle2D.Double(230,30,100,100,10,10),false);}publicvoidsetAffineTransform(AffineTransformat){myPath.transform(at);}publicbooleancontains(Pointp){returnmyPath.contains(p);}@OverrideprotectedvoidpaintComponent(Graphicsg){super.paintComponent(g);Graphics2Dg2=(Graphics2D)g;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);g2.setColor(Color.blue);g2.fill(myPath);g2.setColor(Color.red);g2.setStroke(newBasicStroke(STROKE_SIZE));g2.draw(myPath);}}classShapePlayMouseListenerextendsMouseAdapter{privatestaticfinaldoubleSCALE_RATIO=10.0/9.0;privateShapePlayPanelspPanel;privatePointmousePressedPt=null;publicShapePlayMouseListener(ShapePlayPanelspPanel){this.spPanel=spPanel;}@OverridepublicvoidmousePressed(MouseEvente){Pointp=e.getPoint();mousePressedPt=p;}@OverridepublicvoidmouseReleased(MouseEvente){mousePressedPt=null;}@OverridepublicvoidmouseDragged(MouseEvente){if(mousePressedPt!=null){Pointp=e.getPoint();doubletx=p.x-mousePressedPt.x;doublety=p.y-mousePressedPt.y;spPanel.setAffineTransform(newAffineTransform());spPanel.setAffineTransform(AffineTransform.getTranslateInstance(tx,ty));spPanel.repaint();mousePressedPt=p;}}@OverridepublicvoidmouseWheelMoved(MouseWheelEvente){Pointp=e.getPoint();intwheelRotation=e.getWheelRotation();// get scale factors based on direction of wheel rotationdoublesx=(wheelRotation>0)?SCALE_RATIO:1/SCALE_RATIO;doublesy=sx;// get translation factors so that expansion is centered at mouse pointdoubletx=p.x*(1-sx);doublety=p.y*(1-sy);AffineTransformat=AffineTransform.getTranslateInstance(tx,ty);at.scale(sx,sy);spPanel.setAffineTransform(at);spPanel.repaint();}}
Qual erro você está tendo?
A
abdneto
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
ViniGodoy
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
abdneto
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
abdneto
Olá a todos, alguém poderia me ajudar. estou querendo fazer o mesmo efeito q está no link abaixo em java