2014-06-09 2 views
0

imageView 내에서 이미지를 확대 할 수 있어야했습니다.android- 이미지를이 CustomImageVIew의 중심으로 이동하는 방법

나는이 CustomImageVIew를 검색하여 사용했으며 정상적으로 작동합니다.

유일한 문제는 이미지를 화면의 왼쪽 상단으로 이동하는 것입니다.

죄송합니다. 스크린 샷을 게시 할 수 없습니다. 이것을 고려해보십시오. 화면 왼쪽 상단의 1/4입니다. 이 레이아웃 XML

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Matrix; 
import android.graphics.Point; 
import android.graphics.PointF; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.ImageView; 

public class CustomImageVIew extends ImageView implements OnTouchListener { 


private Matrix matrix = new Matrix(); 
private Matrix savedMatrix = new Matrix(); 

static final int NONE = 0; 
static final int DRAG = 1; 
static final int ZOOM = 2; 

private int mode = NONE; 

private PointF mStartPoint = new PointF(); 
private PointF mMiddlePoint = new PointF(); 
private Point mBitmapMiddlePoint = new Point(); 

private float oldDist = 1f; 
private float matrixValues[] = {0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; 
private float scale; 
private float oldEventX = 0; 
private float oldEventY = 0; 
private float oldStartPointX = 0; 
private float oldStartPointY = 0; 
private int mViewWidth = -1; 
private int mViewHeight = -1; 
private int mBitmapWidth = -1; 
private int mBitmapHeight = -1; 
private boolean mDraggable = false; 


public CustomImageVIew(Context context) { 
    this(context, null, 0); 
} 

public CustomImageVIew(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public CustomImageVIew(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    this.setOnTouchListener(this); 
} 

@Override 
public void onSizeChanged (int w, int h, int oldw, int oldh){ 
    super.onSizeChanged(w, h, oldw, oldh); 
    mViewWidth = w; 
    mViewHeight = h; 
} 

public void setBitmap(Bitmap bitmap){ 
    if(bitmap != null){ 
     setImageBitmap(bitmap); 

     mBitmapWidth = bitmap.getWidth(); 
     mBitmapHeight = bitmap.getHeight(); 
     mBitmapMiddlePoint.x = (mViewWidth/2) - (mBitmapWidth/2); 
     mBitmapMiddlePoint.y = (mViewHeight/2) - (mBitmapHeight/2); 

     matrix.postTranslate(mBitmapMiddlePoint.x, mBitmapMiddlePoint.y); 
     this.setImageMatrix(matrix); 
    } 
} 

@Override 
public boolean onTouch(View v, MotionEvent event){ 
    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
    case MotionEvent.ACTION_DOWN: 
     savedMatrix.set(matrix); 
     mStartPoint.set(event.getX(), event.getY()); 
     mode = DRAG; 
     break; 
    case MotionEvent.ACTION_POINTER_DOWN: 
     oldDist = spacing(event); 
     if(oldDist > 10f){ 
      savedMatrix.set(matrix); 
      midPoint(mMiddlePoint, event); 
      mode = ZOOM; 
     } 
     break; 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_POINTER_UP: 
     mode = NONE; 
     break; 
    case MotionEvent.ACTION_MOVE: 
     if(mode == DRAG){ 
      drag(event); 
     } else if(mode == ZOOM){ 
      zoom(event); 
     } 
     break; 
    } 

    return true; 


    } 



    public void drag(MotionEvent event){ 
     matrix.getValues(matrixValues); 
    float left = matrixValues[2]; 
    float top = matrixValues[5]; 
    float bottom = (top + (matrixValues[0] * mBitmapHeight)) - mViewHeight; 
    float right = (left + (matrixValues[0] * mBitmapWidth)) -mViewWidth; 

    float eventX = event.getX(); 
    float eventY = event.getY(); 
    float spacingX = eventX - mStartPoint.x; 
    float spacingY = eventY - mStartPoint.y; 
    float newPositionLeft = (left < 0 ? spacingX : spacingX * -1) + left; 
    float newPositionRight = (spacingX) + right; 
    float newPositionTop = (top < 0 ? spacingY : spacingY * -1) + top; 
    float newPositionBottom = (spacingY) + bottom; 
    boolean x = true; 
    boolean y = true; 

    if(newPositionRight < 0.0f || newPositionLeft > 0.0f){ 
     if(newPositionRight < 0.0f && newPositionLeft > 0.0f){ 
      x = false; 
     } else{ 
      eventX = oldEventX; 
      mStartPoint.x = oldStartPointX; 
     } 
    } 
    if(newPositionBottom < 0.0f || newPositionTop > 0.0f){ 
     if(newPositionBottom < 0.0f && newPositionTop > 0.0f){ 
      y = false; 
     } else{ 
      eventY = oldEventY; 
      mStartPoint.y = oldStartPointY; 
     } 
    } 

    if(mDraggable){ 
     matrix.set(savedMatrix); 
     matrix.postTranslate(x? eventX - mStartPoint.x : 0, y? eventY - mStartPoint.y : 0); 
     this.setImageMatrix(matrix); 
     if(x)oldEventX = eventX; 
     if(y)oldEventY = eventY; 
     if(x)oldStartPointX = mStartPoint.x; 
     if(y)oldStartPointY = mStartPoint.y; 
    } 



} 

    public void zoom(MotionEvent event){ 
     matrix.getValues(matrixValues); 
    float newDist = spacing(event); 
    float bitmapWidth = matrixValues[0] * mBitmapWidth; 
    float bimtapHeight = matrixValues[0] * mBitmapHeight; 
    boolean in = newDist > oldDist; 

    if(!in && matrixValues[0] < 1){ 
     return; 
    } 
    if(bitmapWidth > mViewWidth || bimtapHeight > mViewHeight){ 
     mDraggable = true; 
    } else{ 
     mDraggable = false; 
    } 

    float midX = (mViewWidth/2); 
    float midY = (mViewHeight/2); 

    matrix.set(savedMatrix); 
    scale = newDist/oldDist; 
    matrix.postScale(scale, scale, bitmapWidth > mViewWidth ? mMiddlePoint.x : midX, bimtapHeight > mViewHeight ? mMiddlePoint.y : midY); 

    this.setImageMatrix(matrix); 


    } 




/** Determine the space between the first two fingers */ 
private float spacing(MotionEvent event) { 
    float x = event.getX(0) - event.getX(1); 
    float y = event.getY(0) - event.getY(1); 

    return (float)Math.sqrt(x * x + y * y); 
} 

/** Calculate the mid point of the first two fingers */ 
private void midPoint(PointF point, MotionEvent event) { 
    float x = event.getX(0) + event.getX(1); 
    float y = event.getY(0) + event.getY(1); 
    point.set(x/2, y/2); 
} 




} 

입니다 :

내가 화면

이의 중심에 와서 이미지를 만들고 싶어하는 클래스입니다

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_gravity="center" 
android:gravity="center" 
android:background="#000" > 

<mypackagename.CustomImageVIew 
    android:id="@+id/imageView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_marginBottom="5dp" 
    android:layout_marginLeft="5dp" 
    android:layout_marginRight="5dp" 
    android:layout_marginTop="5dp" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:scaleType="matrix" 
    /> 

답변

1

내 화면에보기가 표시되기 전에 setBitmap으로 전화하는 것입니다. 아직 볼 수 있습니다. 너비와 높이가 0입니다.

이 문제를 해결할 수있는 몇 가지 옵션이 있지만 일반적으로 이미지보기를 변경하여 setBitmap에서 처음으로 onSizeChanged의 너비와 높이가 0보다 큰 호출 또는 첫 번째 시간 onDraw이 호출되고 getWidth()getHeight()이 모두 0보다 크게 반환됩니다. setBitmap이 호출되고 뷰에 이미 너비와 높이가 있으면 계산을 즉시 수행하십시오.

여기 거친 (안된) 그림의 :

@Override 
public void onSizeChanged (int w, int h, int oldw, int oldh){ 
    super.onSizeChanged(w, h, oldw, oldh); 
    mViewWidth = w; 
    mViewHeight = h; 
    if (w > 0 && h > 0 && mBitmapWidth > 0 && mBitmapHeight > 0) { 
     centerBitmap(); 
    } 
} 

public void setBitmap(Bitmap bitmap){ 
    if(bitmap != null){ 
     setImageBitmap(bitmap); 

     mBitmapWidth = bitmap.getWidth(); 
     mBitmapHeight = bitmap.getHeight(); 

     if (getWidth() > 0 && getHeight() > 0) { 
      centerBitmap(); 
     } 

    } 
} 

private void centerBitmap() { 
    mBitmapMiddlePoint.x = (mViewWidth/2) - (mBitmapWidth/2); 
    mBitmapMiddlePoint.y = (mViewHeight/2) - (mBitmapHeight/2); 

    matrix.postTranslate(mBitmapMiddlePoint.x, mBitmapMiddlePoint.y); 
    this.setImageMatrix(matrix); 
} 
+0

감사를 시도하지만 그것이 작동 시간을 보낸 이후 – user3718930

+0

근무하지 않습니다, 귀하의 코드는 괜찮아요, 문제는 자바 파일에서, 나는 img.setBitmap (비트 맵)을 사용해야했습니다; 대신이 img.setImageBitmap (비트 맵); . 어쨌든 당신 덕분에 – user3718930

0

FrameLayout이 대신 상대 레이아웃을 가지고 .. 답장을

+0

답장을 보내 주셔서 감사합니다하지만 작동하지 않습니다 – user3718930

관련 문제