2011-09-06 12 views
0

내 응용 프로그램에는 리소스에서 이미지를 가져 오는 활동이 있습니다. 동일한 이미지에서 패닝 및 확대/축소 기능을 통합했습니다.이미지 위에 사각형 그리기

내가 원했던 것은 직사각형도 이미지와 함께 확대/축소 및 팬하는 방식으로 사각형을 그립니다. 나는 뷰를 확장하고 무승부를 무시하려고 시도했다. 직사각형 만이오고 이미지는 아닙니다. 누군가가 나를 도울 수 있다면 매우 도움이 될 것입니다.

public class XYZ extends Activity implements OnTouchListener { 
    private static final String TAG = "Touch" ; 
    // These matrices will be used to move and zoom image 
    Matrix matrix = new Matrix(); 
    Matrix savedMatrix = new Matrix(); 

    // We can be in one of these 3 states 
    static final int NONE = 0; 
    static final int DRAG = 1; 
    static final int ZOOM = 2; 
    int mode = NONE; 
    PointF start = new PointF(); 
    PointF mid = new PointF(); 
    float oldDist = 1f; 
    private Bitmap mBitmap; 
    ImageView mapView; 
    /** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) {   
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.jubileemap); 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inDither= false;  
     options.inInputShareable=true; 
     options.inTempStorage=new byte[8*1024]; 

     mapView = (ImageView) findViewById(R.id.abc);   

     mBitmap =BitmapFactory.decodeResource(XYZ.this.getResources(),R.drawable.pqr, options); 
     mapView.setImageBitmap(mBitmap); 

     mapView.setOnTouchListener(JubileeMaps.this); 

    } 
    @Override 
     public void onLowMemory(){ 
     Log.e("low memory", "low"); 
     System.gc(); 
     } 
    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); 
     } 
     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); 
     } 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      mapView.setScaleType(ImageView.ScaleType.MATRIX); 
      // TODO Auto-generated method stub 
      ImageView view = (ImageView) v; 
      // Dump touch event to log 
      dumpEvent(event); 
      // Handle touch events here... 
      /*spacing(event); 
       midPoint(point,event);*/ 
      switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       savedMatrix.set(matrix); 
       start.set(event.getX(), event.getY()); 
       Log.d(TAG, "mode=DRAG"); 
       mode = DRAG; 
       break; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_POINTER_UP: 
       mode = NONE; 
       Log.d(TAG, "mode=NONE"); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       if (mode == DRAG) { 
        matrix.set(savedMatrix); 
        matrix.postTranslate(event.getX() - start.x, 
          event.getY() - start.y); 
       } else if (mode == ZOOM) { 
        float newDist = spacing(event); 
        Log.d(TAG, "newDist=" + newDist); 
        if (newDist > 10f) { 
         matrix.set(savedMatrix); 
         float scale = newDist/oldDist; 
         matrix.postScale(scale, scale, mid.x, mid.y); 
        } 
       } 
       break; 
      case MotionEvent.ACTION_POINTER_DOWN: 
       oldDist = spacing(event); 
       Log.d(TAG, "oldDist=" + oldDist); 
       if (oldDist > 10f) { 
        savedMatrix.set(matrix); 
        midPoint(mid, event); 
        mode = ZOOM; 
        Log.d(TAG, "mode=ZOOM"); 
       } 
       break; 

      } 

      // Perform the transformation 
      view.setImageMatrix(matrix); 
      return true; // indicate event was handled 
     } 
     private void dumpEvent(MotionEvent event) { 
      String names[] = { "DOWN" , "UP" , "MOVE" , "CANCEL" , "OUTSIDE" , 
        "POINTER_DOWN" , "POINTER_UP" , "7?" , "8?" , "9?" }; 
      StringBuilder sb = new StringBuilder(); 
      int action = event.getAction(); 
      int actionCode = action & MotionEvent.ACTION_MASK; 
      sb.append("event ACTION_").append(names[actionCode]); 
      if (actionCode == MotionEvent.ACTION_POINTER_DOWN 
        || actionCode == MotionEvent.ACTION_POINTER_UP) { 
       sb.append("(pid ").append(
         action >> MotionEvent.ACTION_POINTER_ID_SHIFT); 
       sb.append(")"); 
      } 
      sb.append("["); 
      for (int i = 0; i < event.getPointerCount(); i++) { 
       sb.append("#").append(i); 
       sb.append("(pid ").append(event.getPointerId(i)); 
       sb.append(")=").append((int) event.getX(i)); 
       sb.append(",").append((int) event.getY(i)); 
       if (i + 1 < event.getPointerCount()) 
        sb.append(";"); 
      } 
      sb.append("]"); 
      Log.d(TAG, sb.toString()); 
     } 
     @Override 
      public void onPause() 
      { 
      super.onPause(); 
      System.gc(); 
      } 
     @Override 
      protected void onResume() 
      { 
      super.onResume(); 
      System.gc();    
      } 
     @Override 
     protected void onDestroy() { 
     super.onDestroy(); 
     System.gc(); 

     mapView.setImageBitmap(null); 
     mBitmap.recycle(); 
     } 


} 

그리고 내가 사용하고 XML은 다음과 같습니다

<ImageZoomView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/zoomview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    /> 

이 내가하는 것이다 영역을 표시하기 위해 recagle을 그릴 싶어 이미지의 상단에 using..now있어 코드입니다 내 이미지는 확대/축소됩니다. 그러나 이것을 구현할 수 없습니다.

+0

당신이 오버로드 그리기 방법의 코드를 게시 할 수 있습니다

이 예제를 참조하십시오? – slayton

+0

저는 Canvas를 사용하여 직사각형을 그릴 수 있습니다. 한 가지 방법이 있습니다. 다른 하나는 개인 클래스를 만들고보기를 확장하고 onDraw 메서드를 재정의하는 것입니다. 내가 원한다면지도 나 직사각형을 얻습니다. 제발 도와주세요. – amithotu

답변

2

onDraw 메서드를 재정의해야합니다.

super.onDraw()를 호출하고 사용자 정의 도면을 해당 행 아래에 두십시오. http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/LabelView.html

+0

나는 그것을 시도했다. 그러나 무슨 일이 발생하는지는 드로잉을 위해 캔버스 만 사용할 때 나는 사각형을 얻지 못한다. 그리고 onDraw 메서드를 오버라이드하면 사각형 만 나타난다. 내 코드와 XML을 넣었습니다. 만약 당신이 그걸 확인하고 무언가를 제안 해 주시고, 가능하다면 데모 링크를주세요. 감사. – amithotu

관련 문제