2012-03-23 3 views
0

Я использую следующий код для обнаружения ScaleGesture представления. ScaleGestureDetector отлично работает. Я показал два изображения в своем макете. При обнаружении ScaleGesture я уменьшаю и увеличиваю размер изображений. Мне также нужно щелкнуть или коснуться изображения, чтобы сделать какой-то процесс. Если я использую setOnClickListener вместо setOnTouchListener, ScaleGestureDetector не работает. При касании экрана двумя пальцами, setOnTouchListener запускается перед ScaleGestureDetector. Как я могу достичь как ontouch, так и scaleGesture.Нужна помощь при использовании ScaleGestureDetector в android

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

+1

Это может быть правдой в текущей версии, но мы не должны полагаться на реализацию классов в SDK. Как предлагалось в документе, всегда передавать результат onTouchEvent() является предпочтительной практикой. –

1

Вы перекрывая onTouchEvent в вашей деятельности. В этом методе вы передаете события вашему ScaleGestureDetector, но проблема в том, что здесь будут отправляться только события касания, которые не обрабатываются детскими представлениями. Вы возвращаете false в методах children onTouch(). Это хорошо ... onTouchEvent в вашей деятельности следует назвать следующим.

Если вы хотите использовать событие, которое должно быть отправлено вашим детским представлениям, вы должны посмотреть onInterceptTouchEvent (событие MotionEvent) в ViewGroup. http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent). Здесь, если вы хотите использовать событие, верните true. Следующие события будут отправлены методу OnTouchEvent ViewGroup. Если вы вернете false, события будут отправлены дочерним группам ViewGroup.

Вам необходимо будет расширить ViewGroup, чтобы, конечно, переопределить этот метод.

Дайте мне знать, если это правильное понимание вашего вопроса. Я могу попытаться помочь еще немного, если это возможно.

Смежные вопросы