2011-09-06 219 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