2013-11-25 5 views
1

이미지 뷰 변형에 대한 자습서가 있습니다. 정말 필요합니다. here is the link. 그것은 잘 작동하지만 약간 수정해야합니다. 여기 내 문제는 두 번째 이미지 뷰를 추가 할 때 내가 추가 한 첫 번째 이미지 뷰를 수정할 수 없다는 것입니다. 그것은 두 번째 관점 뒤에 있기 때문에 나는 그것을 만질 수없는 것 같습니다. 나는이 문제에 대해서도 묻고있는 링크에서 주석을 읽었으며 settag 및 gettag를 수행하여 문제를 해결합니다. 어떻게해야할지 모르겠다. 어떤 제안이야? 감사. 안드로이드와 이미지에 xml 파일 세트 태그에서ImageView onTouchListener : 뒤에서 이미지 뷰를 터치 할 수 없습니다.

:

public class MainActivity extends Activity implements OnTouchListener { 

    // these matrices will be used to move and zoom image 
    private Matrix matrix = new Matrix(); 
    private Matrix savedMatrix = new Matrix(); 
    // we can be in one of these 3 states 
    private static final int NONE = 0; 
    private static final int DRAG = 1; 
    private static final int ZOOM = 2; 
    private int mode = NONE; 
    // remember some things for zooming 
    private PointF start = new PointF(); 
    private PointF mid = new PointF(); 
    private float oldDist = 1f; 
    private float d = 0f; 
    private float newRot = 0f; 
    private float[] lastEvent = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ImageView view = (ImageView) findViewById(R.id.imageView); 
     ImageView view2 = (ImageView) findViewById(R.id.imageView2); 
     view.setOnTouchListener(this); 
     view2.setOnTouchListener(this); 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
     // handle touch events here 
     ImageView view = (ImageView) v; 
     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       savedMatrix.set(matrix); 
       start.set(event.getX(), event.getY()); 
       mode = DRAG; 
       lastEvent = null; 
       break; 
      case MotionEvent.ACTION_POINTER_DOWN: 
       oldDist = spacing(event); 
       if (oldDist > 10f) { 
        savedMatrix.set(matrix); 
        midPoint(mid, event); 
        mode = ZOOM; 
       } 
       lastEvent = new float[4]; 
       lastEvent[0] = event.getX(0); 
       lastEvent[1] = event.getX(1); 
       lastEvent[2] = event.getY(0); 
       lastEvent[3] = event.getY(1); 
       d = rotation(event); 
       break; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_POINTER_UP: 
       mode = NONE; 
       lastEvent = null; 
       break; 
      case MotionEvent.ACTION_MOVE: 
       if (mode == DRAG) { 
        matrix.set(savedMatrix); 
        float dx = event.getX() - start.x; 
        float dy = event.getY() - start.y; 
        matrix.postTranslate(dx, dy); 
       } else if (mode == ZOOM) { 
        float newDist = spacing(event); 
        if (newDist > 10f) { 
         matrix.set(savedMatrix); 
         float scale = (newDist/oldDist); 
         matrix.postScale(scale, scale, mid.x, mid.y); 
        } 
        if (lastEvent != null && event.getPointerCount() == 2) { 
         newRot = rotation(event); 
         float r = newRot - d; 
         float[] values = new float[9]; 
         matrix.getValues(values); 
         float tx = values[2]; 
         float ty = values[5]; 
         float sx = values[0]; 
         float xc = (view.getWidth()/2) * sx; 
         float yc = (view.getHeight()/2) * sx; 
         matrix.postRotate(r, tx + xc, ty + yc); 
        } 
       } 
       break; 
     } 

     view.setImageMatrix(matrix); 
     return true; 
    } 


    /** 
    * 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); 
    } 

    /** 
    * Calculate the degree to be rotated by. 
    * 
    * @param event 
    * @return Degrees 
    */ 
    private float rotation(MotionEvent event) { 
     double delta_x = (event.getX(0) - event.getX(1)); 
     double delta_y = (event.getY(0) - event.getY(1)); 
     double radians = Math.atan2(delta_y, delta_x); 
     return (float) Math.toDegrees(radians); 
    } 
} 


<?xml version="1.0" encoding="utf-8"?> 

<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

<ImageView android:id="@+id/imageView" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:scaleType="matrix" 
android:src="@drawable/chill" 
/> 

<ImageView 
    android:id="@+id/imageView2" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
android:scaleType="matrix" 
    android:src="@drawable/awesome" 
    /> 


</FrameLayout> 

답변

0

이 하나를 시도 태그 실행시에 태그를 얻고 특정 이미지에 변환을 적용합니다.

1.Implement 자바 클래스에있어서, 화상 중 하나를 클릭하는 방법 2.Call

,

3.And하는 View.getTag()를 사용하여 태그를 가져와 이미지를 식별; 변환을 적용합니다.

+1

내 문제는 내가 두 번째 ImageView를 추가 할 때 추가 한 첫 번째 이미지 뷰를 만질 수 없다는 것입니다. 어떻게하면 첫 번째 이미지에 액세스 할 수 있습니까? – Erick

+0

프레임 레이아웃을 사용하여 한 이미지를 다른 이미지 위에 두어 클릭 이벤트를 두 이미지에 모두주고 이미지에 액세스 할 수있었습니다. 문제가 발생한 곳을 알려주십시오. –

+0

@ JIGAR PANDYA : 버튼을 클릭하여 프로그래밍 방식으로 이미지 뷰를 추가하고 있습니다. 이미지 뷰가 framelayout 내부에 추가됩니다. 첫 번째 이미지 뷰를 추가하면 변환은 잘되지만 두 번째 이미지 뷰를 추가하기 위해 버튼을 클릭하면 첫 번째 뷰가 두 번째 뷰 아래로 이동하여 손댈 수 없게됩니다. 내가 만질 수있는 유일한 것은 제가 추가 한 가장 최근의 견해입니다. 희망을 도울 수있다 :) – Erick