2
현재 이미지를 확대/축소하고 회전하고 표시 할 수있는 이미지 뷰어로 JComponent를 구현하고 있습니다. 모든 기능을 구현했지만 이미지의 오른쪽 하단에서 축소하는 동안 문제가 있습니다. 애니메이션이 매끄럽게 시작될 때마다 그리고 패널의 오른쪽 또는 아래 가장자리에서만 애니메이션이 시작됩니다.JComponent의 오른쪽 하단 모서리에서 애니메이션 확대 기능을 사용하면 말더듬이 발생합니다.
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
if (this.workingCopy != null) {
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
Point2D center = new Point2D.Double((getPreferredSize().width)/2, (getPreferredSize().height)/2);
g2d.scale(getZoom(), getZoom());
g2d.rotate(Math.toRadians(getRotation()), (center.getX() + 0)/getZoom(), (center.getY() + 0)/getZoom());
g2d.drawImage(this.workingCopy,
(int) Math.round(((getPreferredSize().width - (image.getWidth() * getZoom()))/2)/getZoom()),
(int) Math.round(((getPreferredSize().height - (image.getHeight() * getZoom()))/2)/getZoom()), null);
}
}
public synchronized void setZoom(final double zoom, boolean animated, final Point point) {
final double oldZoom = getZoom();
final Dimension viewSize = getPreferredSize();
final Rectangle viewRect = getVisibleRect();
// get relative point
double relX = viewRect.getX()/viewSize.getWidth();
double relY = viewRect.getY()/viewSize.getHeight();
// new size
double newViewSizeWidth = (getImageBounds().getWidth()/oldZoom) * zoom;
double newViewSizeHeight = (getImageBounds().getHeight()/oldZoom) * zoom;
double deltaDiffX = (point.getX() - viewRect.getX())/viewSize.getWidth();
double deltaDiffY = (point.getY() - viewRect.getY())/viewSize.getHeight();
double newDiffX = newViewSizeWidth * deltaDiffX;
double newDiffY = newViewSizeHeight * deltaDiffY;
double viewPositionX = (newViewSizeWidth * relX) + newDiffX - (point.getX() - viewRect.getX());
double viewPositionY = (newViewSizeHeight * relY) + newDiffY - (point.getY() - viewRect.getY());
final Point newPoint = new Point((int) Math.round(viewPositionX), (int) Math.round(viewPositionY));
if (animated && !zooming) {
Animator animator = new Animator(getAnimationSpeed(), new TimingTargetAdapter() {
@Override
public void begin() {
super.begin();
zooming = true;
}
@Override
public void timingEvent(final float fraction) {
super.timingEvent(fraction);
double zoomDiff = zoom - oldZoom;
setZoom(oldZoom + (fraction * zoomDiff),
new Point(
(int) Math.round(viewRect.getX() - (viewRect.getX() - newPoint.getX()) * fraction),
(int) Math.round(viewRect.getY() - (viewRect.getY() - newPoint.getY()) * fraction)));
}
@Override
public void end() {
super.end();
zooming = false;
}
});
animator.start();
} else {
setZoom(zoom, newPoint);
}
}
누군가 내가 잘못한 것을 지적하거나 줌 애니메이션을 위해 concider를 잊어 버릴 수 있습니까? 애니메이션이 축소되는 동안 끊김 현상을 제외한 모든 작업이 작동합니다.
미리 도움을 주셔서 감사합니다.
더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/) – mKorbel
과 함께 질문을 수정하십시오. 모서리는 항상 문제가됩니다. ['FauxImage'] (http://stackoverflow.com/a/8090328/230513)는 youe [sscce] (http://sscce.org/)를 만드는 데 유용 할 수 있습니다. – trashgod
해결 방법이 있지만 여전히 문제를 해결할 수있는 더 좋은 방법이 있는지 여부를 확인하는 것이 좋습니다. 내부 변수 'width'와 'height'를 소개하고 버퍼 영역으로 기본 크기에 250px를 추가했습니다. 또한 구성 요소의 scrollToVisibleRect 메서드를 제한하고 모든 변형을 확인하고 표시 rect에 버퍼 영역의 일부가 표시되지 않는지 여부를 업데이트합니다. – user1291485