2012-03-23 21 views
0

我使用下面的代碼來檢測視圖的ScaleGesture。 ScaleGestureDetector工作正常。我在佈局中顯示了兩張圖片。在檢測ScaleGesture時,我減少並增加了圖像的大小。我還需要點擊或觸摸圖像來完成一些過程。如果我使用setOnClickListener而不是setOnTouchListener,則ScaleGestureDetector不起作用。用兩根手指觸摸屏幕時,setOnTouchListener在ScaleGestureDetector之前觸發。我怎樣才能實現ontouch和scaleGesture。在Android中使用ScaleGestureDetector時需要幫助

package com.pinch.detect; 

import java.io.BufferedInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.ScaleGestureDetector; 
import android.view.View; 
import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener; 
import android.view.View.OnClickListener; 
import android.view.View.OnTouchListener; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class PinchDetectorActivity extends Activity { 
    TextView textGestureAction; 
    ImageView img1,img2; 
    static Bitmap bm, bm1; 
    String url1="url1111"; 
     String url2="url2222"; 

    private ScaleGestureDetector scaleGestureDetector; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      textGestureAction = (TextView)findViewById(R.id.GestureAction); 
      img1=(ImageView)findViewById(R.id.img_left); 
      img2=(ImageView)findViewById(R.id.img_right); 

     try { 
      URL aURL = new URL(url1); 
      // parseBitmap(aURL); 
      URLConnection conn = aURL.openConnection(); 
      conn.connect(); 
      InputStream is = conn.getInputStream(); 

      /* Buffered is always good for a performance plus. */ 
      BufferedInputStream bis = new BufferedInputStream(is); 

      /* Decode url-data to a bitmap. */ 
      bm = BitmapFactory.decodeStream(bis); 

      bis.close(); 
      is.close(); 

      /* Apply the Bitmap to the ImageView that will be returned. */ 

      img1.setImageBitmap(bm); 

      URL aURL1 = new URL(url2); 
      URLConnection conn1 = aURL1.openConnection(); 
      conn1.connect(); 
      InputStream is1 = conn1.getInputStream(); 

      BufferedInputStream bis1 = new BufferedInputStream(is1); 

      bm1 = BitmapFactory.decodeStream(bis1); 

      bis1.close(); 
      is1.close(); 

      img2.setImageBitmap(bm1); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
      scaleGestureDetector = new ScaleGestureDetector(this, 
      new MySimpleOnScaleGestureListener()); 

      img1.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getApplicationContext(), "clicked image 1", Toast.LENGTH_SHORT).show(); 
       return false; 
      } 
     }); 

      img2.setOnTouchListener(new OnTouchListener() { 

       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        // TODO Auto-generated method stub 
        Toast.makeText(getApplicationContext(), "clicked image 2", Toast.LENGTH_SHORT).show(); 
        return false; 
       } 
      }); 

     /* img1.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        Toast.makeText(getApplicationContext(), "clicked image 1", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
      img2.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        Toast.makeText(getApplicationContext(), "clicked image 2", Toast.LENGTH_SHORT).show(); 
       } 
      });*/ 
     } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
    // TODO Auto-generated method stub 
    scaleGestureDetector.onTouchEvent(event); 
    return true; 
    } 

    public class MySimpleOnScaleGestureListener extends 
    SimpleOnScaleGestureListener { 

    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     // TODO Auto-generated method stub 

     float scaleFactor = detector.getScaleFactor(); 
     if(scaleFactor > 1){ 
      Log.v("inside scale factor if","if"); 
     textGestureAction.setText("Scale Out: " + String.valueOf(scaleFactor)); 

     Bitmap resizedbitmap = Bitmap.createScaledBitmap(bm, 200, 
       480, true); 
     img1.setImageBitmap(resizedbitmap); 
     Bitmap resizedbitmap1 = Bitmap.createScaledBitmap(bm1, 200, 
       480, true); 
     img2.setImageBitmap(resizedbitmap1); 

     }else{ 
      Log.v("inside scale factor else","else"); 
     textGestureAction.setText("Scale In: " + String.valueOf(scaleFactor)); 


     Bitmap resizedbitmap = Bitmap.createScaledBitmap(bm, 400, 
       480, true); 

     img1.setImageBitmap(resizedbitmap); 

     Bitmap resizedbitmap1 = Bitmap.createScaledBitmap(bm1, 400, 
       480, true); 

     img2.setImageBitmap(resizedbitmap1); 


     } 

     return true; 
    } 
    } 
    } 

回答

1

的的onTouchEvent()應實行這樣的:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    boolean handled = scaleGestureDetector.onTouchEvent(event); 
    return super.onTouchEvent(event) || handled; 
} 
+0

雖然ScaleGestureDetector onTouchEvent()總是返回true。 – mdupls 2012-04-30 15:43:24

+1

這在當前版本中可能是正確的,但我們不應該依賴於SDK中類的實現。正如文檔所建議的,總是傳遞onTouchEvent()的結果是首選的做法。 – 2012-05-04 05:02:05

1

你在你活動覆蓋的onTouchEvent。在這種方法中,您將事件傳遞給您的ScaleGestureDetector,但問題是隻有觸摸事件不會被子視圖處理。您在孩子的onTouch()方法中返回false。這很好......你的活動中的onTouchEvent應該在下一次被調用。

如果你想消費應發送給你的孩子的意見,你應該看一看onInterceptTouchEvent(MotionEvent事件)在​​ViewGroup中的事件。 http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)。在這裏,如果您想要使用該事件,請返回true。以下事件將發送到ViewGroup的onTouchEvent方法。如果您返回false,則這些事件將發送給ViewGroup的子項。

你將不得不擴展一個ViewGroup,以覆蓋這個方法當然。

讓我知道這是否是你的問題的正確理解。如果可能的話,我可以嘗試幫助更多人。