2016-10-06 1 views
0

Ich habe eine Image in einer scrollbaren Ansicht.Android ImaveView nicht gezoomte Bild wickelt

<jp.vuph.TwoDScrollView 
    android:id="@+id/two_d_scroll_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/white"> 
    <RelativeLayout 
     android:id="@+id/layout_drawing" 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
     <ImageView 
      android:id="@+id/image_view_main" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:scaleType="matrix" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:adjustViewBounds="true" 
      android:contentDescription="@string/contentDescription"/> 
    </RelativeLayout> 
</jp.vuph.TwoDScrollView> 

Als ich das Bild zu vergrößern, ist, dass Image nicht alle das gezoomte Bild verzerren, so kann ich nicht ein Teil von it.This ist mein Code

private class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener { 

    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     d = mImageViewMain.getDrawable(); 
     mScale *= detector.getScaleFactor(); 

     float xDiff = initialFocalPoints[0] - currentFocalPoints[0]; 
     float yDiff = initialFocalPoints[1] - currentFocalPoints[1]; 

     matrix.setScale(mScale, mScale, currentFocalPoints[0], currentFocalPoints[1]); 
     matrix.postTranslate(xDiff, yDiff); 
     mImageViewMain.setImageMatrix(matrix); 
     return true; 
    } 

    @Override 
    public boolean onScaleBegin(ScaleGestureDetector detector) { 
     float startX = detector.getFocusX(); 
     float startY = detector.getFocusY(); 

     initialFocalPoints = new float[]{startX, startY}; 
     Matrix inverseTransformMatrix = new Matrix(); 
     if(matrix.invert(inverseTransformMatrix)) 
     inverseTransformMatrix.mapPoints(currentFocalPoints, initialFocalPoints); 
     return true; 
    } 

    @Override 
    public void onScaleEnd(ScaleGestureDetector detector) { 
     return; 
    } 

Ist es möglich, sehen lässt ImageView das gezoomte Bild umbrechen? Ich habe viele Möglichkeiten ausprobiert, kann das aber immer noch nicht.

Antwort

0

Wenn ich recht habe, passiert Folgendes: Sie zoomen einen Fokuspunkt an, und wenn Sie einen anderen Fokuspunkt verkleinern, sehen Sie am Rand des Bildes einen leeren Bereich, weil es nicht t zentriert.

Ich hatte mit diesem in meiner benutzerdefinierten Pinch-Zoom Bildansicht zu beschäftigen. Was geschehen muss, ist, dass die Grenzen des transformierten Bildes überprüft werden müssen, um gegen die Grenzen der ImageView selbst, und wenn eine Schranke im ImageView ist, wird eine zusätzliche Übersetzung muss hinzugefügt werden, um den leeren Raum zu korrigieren.

Um dies zu tun, habe ich Matrix.mapRect() mir eine Vorschau zu geben, wie das Bild aussehen würde verwandeln. Diese

sind Eigenschaften, so dass Sie nur zuweisen jede RectF einmal:

 RectF imageRect = new RectF(0, 0, bitmap.getIntrinsicWidth(), bitmap.getIntrinsicHeight()); 

     RectF viewRect = new RectF(0, 0, mImageViewMain.getWidth(), mImageViewMain.getHeight()); 

     RectF transform = new RectF(); 

Beachten Sie, dass Sie dies nicht tun, bis nach allem, was gemessen wurde und angelegt.

Setzen Sie den Code in followin onScale() nach setScale() und postTranslate() aber vor mImageViewMain.setImageMatrix(matrix);

 matrix.mapRect(transform, imageRect); // dst, src 

     // for this code to work, your matrix scaleX/Y can never be less that 1.0 

     float xAdj = 0F; 
     float yAdj = 0F; 
     if (transform.left > 0) { // blank space on left 
      xAdj = - transform.left; 
     } else if (transform.right < mImageViewMain.getWidth()) { // on right 
      xAdj = mImageViewMain.getWidth() - transform.right; 
     } 

     if (transform.top > 0) { // blank space on top 
      yAdj = - transform.top; 
     } else if (transform.bottom < mImageViewMain.getHeight()) { // on bottom 
      yAdj = mImageViewMain.getHeight() - transform.bottom; 
     } 

     matrix.postScale(xAdj, yAdj); 

Dieser Code kann nicht ganz richtig sein, aber Sie bekommen die Idee. Verwenden Sie matrix.mapRect(), um zu sehen, wenn du gehst Leerzeichen haben, dann rufen Sie matrix.postScale() die leeren Räume zu beheben.

Der Teil I aus dem Code links ist, dass Sie in etwas mehr Phantasie Berechnung zu setzen, weil das Seitenverhältnis des Bildes nicht das Seitenverhältnis der ImageView entsprechen kann, so dass manchmal Sie die Grenzen sein wollen innerhalb, aber in diesem Fall müssen Sie die Einstellung vornehmen, damit das Bild zentriert wird. Es ist nur eine Menge Mathematik.

Verwandte Themen