나는 많은 양의 확대/축소 질문을 읽고 여기에서 좌표를 다시 계산한다는 말로 시작하겠습니다. 그러나 나는 그들을 내 상황에 적용 할 수 없다.행렬을 사용하여 초점 주변의 이미지 뷰를 줌하는 올바른 방법
줌 및 스크롤 할 수있는 사용자 지정 ImageView 클래스가 있습니다. (이 작품)
- 는 점에서 확대 및 초점으로 그 포인트를 사용 : 나는 데 문제는이 순서대로 다음을 수행에서 온다 (가 작동하지 않습니다) 여기
다른 점 중 하나에서 확대/축소하려면 사용자 정의보기의 예입니다. 빨간색과 녹색의 두 가지 원이 있습니다. 빨간색은 초점 은이어야하고 녹색은 초점이 가까이있는 곳입니다. 실제로는입니다.
주황색으로 표시된 부분을 확대하려고 할 때 문제가 발생합니다. 아래 그림에서 주황색 원 영역을 확대하려고 시도했습니다 (초점 위치가 계산 된 위치 만 표시). 아래에서 볼 수 있듯이 빨간색 원은 새 초점을 올바르게 계산하지만 어떤 이유로 인해 녹색 원이 실제로 확대/축소되는 위치입니다. 나는 실제 이미지 뷰와 확대 된 좌표를 매핑하려면 다음 코드를 사용하고
위 사진에있는 녹색 점은 디버깅 목적으로 {oldCoordinates[0], oldCoordinates[1]}
에로 설정하고,
public boolean onScale(ScaleGestureDetector detector) {
//update the current scale
scaleFactor *= detector.getScaleFactor();
scaleFactor = Math.max(ZOOM_LEVEL_4, Math.min(scaleFactor, ZOOM_LEVEL_0));
//applying the scaleFactor to the focal point as determined in onScaleBegin
transformMatrix.setScale(scaleFactor, scaleFactor,
newFocalPoints[0], newFocalPoints[1]);
//apply the matrix to the child
child.transform(transformMatrix, newFocalPoints[0], newFocalPoints[1],
oldFocalPoints[0], oldFocalPoints[1]);
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector){
//when a new scaling process begins, get the current imageMatrix and
//map the points to account for the current zoom level
//the initial points. based on screen location and current scroll pos
float startX = detector.getFocusX() + getScrollX();
float startY = detector.getFocusY() + getScrollY();
oldFocalPoints = new float[]{startX, startY};
//map oldFocalPoints to coordinates of the imageView based on current zoom
Matrix inverseTransformMatrix = new Matrix();
if(transformMatrix.invert(inverseTransformMatrix))
inverseTransformMatrix.mapPoints(newFocalPoints, oldFocalPoints);
return true;
}
좌표 정확히 초점이 아니지만 가까운 거리에 있습니다. 그래서 새로운 초점을 정확하게 계산하는 것처럼 보일지라도 (빨간 원) 정확하게 적용되지 않는 것 같습니다. 누구든지 뭔가 잘못 알아들을 수 있습니까? 미리 감사드립니다!
고마워. 마지막으로 변형하지 않고 내 머리카락을 꺼내고 있었다. – loadedion
은 onfale 또는 다른 어딘가에서 계산 된 currentfocalpoints인가? – ShrimpCrackers