2013-08-26 7 views
2

나는 많은 양의 확대/축소 질문을 읽고 여기에서 좌표를 다시 계산한다는 말로 시작하겠습니다. 그러나 나는 그들을 내 상황에 적용 할 수 없다.행렬을 사용하여 초점 주변의 이미지 뷰를 줌하는 올바른 방법

줌 및 스크롤 할 수있는 사용자 지정 ImageView 클래스가 있습니다. (이 작품)

  • 스크롤을하면서 여전히
  • 노력 확대

    1. 는 점에서 확대 및 초점으로 그 포인트를 사용 : 나는 데 문제는이 순서대로 다음을 수행에서 온다 ( 작동하지 않습니다) 여기

    다른 점 중 하나에서 확대/축소하려면 사용자 정의보기의 예입니다. 빨간색과 녹색의 두 가지 원이 있습니다. 빨간색은 초점 이어야하고 녹색은 초점이 가까이있는 곳입니다. 실제로는입니다. enter image description here

    주황색으로 표시된 부분을 확대하려고 할 때 문제가 발생합니다. 아래 그림에서 주황색 원 영역을 확대하려고 시도했습니다 (초점 위치가 계산 된 위치 만 표시). 아래에서 볼 수 있듯이 빨간색 원은 새 초점을 올바르게 계산하지만 어떤 이유로 인해 녹색 원이 실제로 확대/축소되는 위치입니다. 나는 실제 이미지 뷰와 확대 된 좌표를 매핑하려면 다음 코드를 사용하고

    enter image description here

    위 사진에있는 녹색 점은 디버깅 목적으로 {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; 
    } 
    

    좌표 정확히 초점이 아니지만 가까운 거리에 있습니다. 그래서 새로운 초점을 정확하게 계산하는 것처럼 보일지라도 (빨간 원) 정확하게 적용되지 않는 것 같습니다. 누구든지 뭔가 잘못 알아들을 수 있습니까? 미리 감사드립니다!

  • 답변

    3

    많은 고통을 겪은 끝에 해결책을 발견했습니다.

    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
    
        scaleFactor *= detector.getScaleFactor(); 
        scaleFactor = Math.max(ZOOM_4, Math.min(scaleFactor, ZOOM_LEVEL_0)); 
    
        float xDiff = initialFocalPoints[0] - currentFocalPoints[0]; 
        float yDiff = initialFocalPoints[1] - currentFocalPoints[1]; 
    
        transformMatrix.setScale(scaleFactor, scaleFactor, 
               currentFocalPoints[0], currentFocalPoints[1]); 
        transformMatrix.postTranslate(xDiff, yDiff);  
        child.setImageMatrix(transformMatrix); 
    
        return true; 
    } 
    
    @Override 
    public boolean onScaleBegin(ScaleGestureDetector detector){ 
    
        float startX = detector.getFocusX() + getScrollX(); 
        float startY = detector.getFocusY() + getScrollY(); 
    
        initialFocalPoints = new float[]{startX, startY}; 
    
        if(transformMatrix.invert(inverseTransformMatrix)) 
        inverseTransformMatrix.mapPoints(currentFocalPoints, initialFocalPoints); 
        return true; 
    } 
    

    차분 만든 라인하면 다음 하였다 :

    float xDiff = initialFocalPoints[0] - currentFocalPoints[0]; 
    float yDiff = initialFocalPoints[1] - currentFocalPoints[1]; 
    transformMatrix.postTranslate(xDiff, yDiff); 
    

    해답은 두 점 사이의 차이를 파악하고 매번 이미지를 이미지 뷰 변환만큼이나 간단 여기서 코드는 확장됩니다.

    +0

    고마워. 마지막으로 변형하지 않고 내 머리카락을 꺼내고 있었다. – loadedion

    +0

    은 onfale 또는 다른 어딘가에서 계산 된 currentfocalpoints인가? – ShrimpCrackers