2013-03-19 45 views
2

我正在實現對ImageView的多點觸控縮放,但是當我縮小圖像時,圖像隱藏的某些部分隱藏在某個視圖的後面或由於某種高度限制。Android:ImageView由於某些佈局屬性造成的高度界限

enter image description here

佈局代碼

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/bggray" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <ImageView 
      android:id="@+id/ivapptitle" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:adjustViewBounds="true" 
      android:contentDescription="img" 
      android:scaleType="fitXY" 
      android:src="@drawable/apptitle" /> 
    </LinearLayout> 

    <ScrollView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" android:background="@color/titlecolor1"> 
     <ImageView 
      android:id="@+id/ivdownloadedjpgfile" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_gravity="center" 
      android:layout_marginTop="20dip" 

      android:contentDescription="img" 
      />     

    </ScrollView>  
</LinearLayout> 

類代碼

public class DownloadedImageDisplay extends Activity implements OnTouchListener{ 

    private ImageView ivDownloadedImage; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.staffnotationtd); 
     initializeVars(); 
     showImage(); 
     ivDownloadedImage.setOnTouchListener(this); 
    } 

    private void initializeVars() 
    { 
     ivDownloadedImage = (ImageView) findViewById(R.id.ivdownloadedjpgfile); 
    } 

    public void showImage() 
    { 
     String filePath; 
     Bundle extras = getIntent().getExtras(); 
     if(extras == null) { 
      filePath = null; 
     } else { 
      filePath= extras.getString("JPGFileName"); 
     } 

     Bitmap bitmap = BitmapFactory.decodeFile(filePath); 
     ivDownloadedImage.setImageBitmap(bitmap); 
    } 


    //// Image Zooming code 

    private static final String TAG = "Touch"; 
    // @SuppressWarnings("unused") 
    private static final float MIN_ZOOM = 1f,MAX_ZOOM = 1f; 

    // These matrices will be used to scale points of the image 
    Matrix matrix = new Matrix(); 
    Matrix savedMatrix = new Matrix(); 

    // The 3 states (events) which the user is trying to perform 
    static final int NONE = 0; 
    static final int DRAG = 1; 
    static final int ZOOM = 2; 
    int mode = NONE; 

    // these PointF objects are used to record the point(s) the user is touching 
    PointF start = new PointF(); 
    PointF mid = new PointF(); 
    float oldDist = 1f; 

    @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     ImageView view = (ImageView) v; 
     view.setScaleType(ImageView.ScaleType.MATRIX); 
     float scale; 

     dumpEvent(event); 
     // Handle touch events here... 

     switch (event.getAction() & MotionEvent.ACTION_MASK) 
     { 
      case MotionEvent.ACTION_DOWN: // first finger down only 
               savedMatrix.set(matrix); 
               start.set(event.getX(), event.getY()); 
               Log.d(TAG, "mode=DRAG"); // write to LogCat 
               mode = DRAG; 
               break; 

      case MotionEvent.ACTION_UP: // first finger lifted 

      case MotionEvent.ACTION_POINTER_UP: // second finger lifted 

               mode = NONE; 
               Log.d(TAG, "mode=NONE"); 
               break; 

      case MotionEvent.ACTION_POINTER_DOWN: // first and second finger down 

               oldDist = spacing(event); 
               Log.d(TAG, "oldDist=" + oldDist); 
               if (oldDist > 5f) { 
                savedMatrix.set(matrix); 
                midPoint(mid, event); 
                mode = ZOOM; 
                Log.d(TAG, "mode=ZOOM"); 
               } 
               break; 

      case MotionEvent.ACTION_MOVE: 

               if (mode == DRAG) 
               { 
                matrix.set(savedMatrix); 
                matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); // create the transformation in the matrix of points 
               } 
               else if (mode == ZOOM) 
               { 
                // pinch zooming 
                float newDist = spacing(event); 
                Log.d(TAG, "newDist=" + newDist); 
                if (newDist > 5f) 
                { 
                 matrix.set(savedMatrix); 
                 scale = newDist/oldDist; // setting the scaling of the 
                        // matrix...if scale > 1 means 
                        // zoom in...if scale < 1 means 
                        // zoom out 
                 matrix.postScale(scale, scale, mid.x, mid.y); 
                } 
               } 
               break; 
     } 

     view.setImageMatrix(matrix); // display the transformation on screen 

     return true; // indicate event was handled 
    } 

    /* 
    * -------------------------------------------------------------------------- 
    * Method: spacing Parameters: MotionEvent Returns: float Description: 
    * checks the spacing between the two fingers on touch 
    * ---------------------------------------------------- 
    */ 

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

    /* 
    * -------------------------------------------------------------------------- 
    * Method: midPoint Parameters: PointF object, MotionEvent Returns: void 
    * Description: calculates the midpoint between the 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); 
    } 

    /** Show an event in the LogCat view, for debugging */ 
    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("Touch Events ---------", sb.toString()); 
    } 

} 

回答

1

明白了......我剛剛刪除了滾動視圖,它的工作原理。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/bggray" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <ImageView 
      android:id="@+id/ivapptitle" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:adjustViewBounds="true" 
      android:contentDescription="img" 
      android:scaleType="fitXY" 
      android:src="@drawable/apptitle" /> 
    </LinearLayout> 

     <ImageView 
      android:id="@+id/ivdownloadedjpgfile" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_gravity="center" 
      android:layout_marginTop="20dip" 

      android:contentDescription="img" 
      />     

</LinearLayout> 
0

我不明白這一點包裹你的ImageView中的LinearLayout

我懷疑ImageView的設置它的高度包裝原始圖像,它不會增加ASED。嘗試使用固定的高度。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/bggray" 
    android:orientation="vertical" > 

    <ImageView 
     android:id="@+id/ivapptitle" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:adjustViewBounds="true" 
     android:contentDescription="img" 
     android:scaleType="fitXY" 
     android:src="@drawable/apptitle" /> 

    <ScrollView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" android:background="@color/titlecolor1"> 

     <ImageView 
      android:id="@+id/ivdownloadedjpgfile" 
      android:layout_width="fill_parent" 
      android:layout_height="500dp" 
      android:layout_gravity="center" 
      android:layout_marginTop="20dip" 
      android:contentDescription="img"/>     

    </ScrollView>  
</LinearLayout> 
+0

我試了固定高度500dp或更多,但沒有成功..... – Azhar 2013-03-20 02:01:58