2011-09-06 258 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" 
    /> 

這是我正在using..now上我想畫一個recagle標記的面積將圖像的頂部代碼放大和縮小,因爲我的形象does.But一直無法實現這一點。

+0

你可以張貼重載繪製方法的代碼? – slayton

+0

我只是使用畫布繪製矩形在它上面......這是一種方式,而我嘗試的另一件事是創建一個私人類,並擴展視圖並重寫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