안녕하세요.
구글링도 해보고 이것저것 해보다가 잘 되지 않아서 도움을 얻고자 질문을 드립니다.
이미지뷰를 확대 축소를 하고있는데요!
이미지뷰의 이미지를 기기 해상도 마다 화면에 꽉차게 나오게 하고 싶어서 질문을 드립니다.
( 이미지사이즈 : 480*800 // drawable-nodpi에 들어있습니다. )
//========================================================
imageview = new ImageView( this );
imageview .setImageResource( 이미지
);
imageview .setScaleType( ImageView.ScaleType.MATRIX );
//========================================================
현대 확대 축소를 쓰고 있기 때문에 속성을
setScaleType(ImageView.ScaleType.MATRIX); 이렇게 주고 있는데요.
그러면 확대는 잘되는데, 문제는 해상도가 안맞는다는 점입니다.
setScaleType(ImageView.ScaleType.FIT_XY); 주면
확대가 안되고 해상도에 맞게 나오고.. 둘 중 하나만 되고 있는 상태입니다.
뭘 해봐도 우선 타입은 MATRIX되어있던가 FIT_XY 되어있던가 해야되더라구요. 흠.
해상도를 맞추면서 동시에 확대 축소를 쓸수있는 방법은 없을까요?
확대 축소를 사용하시려면 우선
setScaleType(ImageView.ScaleType.MATRIX); 이것을 사용하여야합니다. 그리고
확대를 한후 페이지를 다시 원상태로 돌리려면 확대했던 내용을 원상태로 복수 시켜야합니다.
아래의 내용을 참고하셔서 해보세여 저도 한참전에 했던 소스라 이해는 잘안되서 많은 설명은 못드리겠네여
public boolean onTouch( View v, MotionEvent event) { view = (ImageView) v; Log.d("onTouch","onTouch"); checksTouch=true; switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: savedMatrix.set(matrix); start.set(event.getX(), event.getY()); mode = DRAG; // Log.d("Action_dwon","Action_dwon"); break; case MotionEvent.ACTION_POINTER_DOWN: oldDist = spacing(event); // Log.d("ACTION_POINTER_DOWN","ACTION_POINTER_DOWN"); if (oldDist > 10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; // Log.d("if","ACTION_POINTER_DOWN"); } break; case MotionEvent.ACTION_UP: // Log.d("ACTION_UP","ACTION_UP"); case MotionEvent.ACTION_POINTER_UP: mode = NONE; // Log.d("ACTION_POINTER_UP","ACTION_POINTER_UP"); break; case MotionEvent.ACTION_MOVE: // Log.d("ACTION_MOVE","ACTION_MOVE"); if (mode == DRAG) { // Log.d("mode==drag","ACTION_MOVE"); matrix.set(savedMatrix); matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); } else if (mode == ZOOM) { float newDist = spacing(event); Log.d("mode==zoom","ACTION_MOVE"); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oldDist; matrix.postScale(scale, scale, mid.x, mid.y); } } break; } Log.d("matrixTurning","matrixTurning"); matrixTurning(matrix, view); Log.d("setImageMatrix","setImageMatrix"); view.setImageMatrix(matrix); return true; } private void matrixTurning(Matrix matrix, ImageView view){ Log.i("matrixTurningdown", "matrixTurningdown"); matrix.getValues(value); while(j==0){ savedMatrix3.getValues(value); j++; } savedMatrix2.getValues(savedValue); width = view.getWidth(); height = view.getHeight(); Log.d("width",Integer.toString(width)); Log.d("height",Integer.toString(height)); Drawable d = view.getDrawable(); if (d == null) return; imageWidth = d.getIntrinsicWidth(); imageHeight = d.getIntrinsicHeight(); scaleWidth = (int) (imageWidth * value[0]); scaleHeight = (int) (imageHeight * value[4]); if (value[2] < width - scaleWidth) value[2] = width - scaleWidth; if (value[5] < height - scaleHeight) value[5] = height - scaleHeight; if (value[2] > 0) value[2] = 0; if (value[5] > 0) value[5] = 0; if (value[0] > 10 || value[4] > 10){ value[0] = savedValue[0]; value[4] = savedValue[4]; value[2] = savedValue[2]; value[5] = savedValue[5]; } if (imageWidth > width && imageHeight > height){ if (scaleWidth < width && scaleHeight < height){ int target = WIDTH; if (imageWidth < imageHeight) target = HEIGHT; if (target == WIDTH) value[0] = value[4] = (float)width / imageWidth; if (target == HEIGHT) value[0] = value[4] = (float)height / imageHeight; scaleWidth = (int) (imageWidth * value[0]); scaleHeight = (int) (imageHeight * value[4]); if (scaleWidth > width) value[0] = value[4] = (float)width / imageWidth; if (scaleHeight > height) value[0] = value[4] = (float)height / imageHeight; } } else{ if (value[0] < 1) value[0] = 1; if (value[4] < 1) value[4] = 1; } scaleWidth = (int) (imageWidth * value[0]); scaleHeight = (int) (imageHeight * value[4]); if (scaleWidth < width){ value[2] = (float) width / 2 - (float)scaleWidth / 2; } if (scaleHeight < height){ value[5] = (float) height / 2 - (float)scaleHeight / 2; } matrix.setValues(value); savedMatrix2.set(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 FloatMath.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); }
해상도에 맞는다는 말의 정의가 무엇인가요?
그리고 그 정의가 확대라는 메카니즘(matrix에 확대 scale을 입력하여 확대를 적용하는 메카니즘)과 충돌하고 있진 않나요?