2012-03-23 17 views
0

次のコードを使用して、ビューのScaleGestureを検出します。 ScaleGestureDetectorは正常に動作します。レイアウトに2つの画像が表示されています。 ScaleGestureを検出している間、私は画像のサイズを減らして大きくします。また、画像をクリックしたり触れたりする必要があります。 setOnTouchListenerの代わりにsetOnClickListenerを使用すると、ScaleGestureDetectorが機能しませんでした。 2つの指で画面に触れている間、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

+1

これは現在のバージョンでは当てはまりますが、SDKでのクラスの実装に頼るべきではありません。ドキュメントで示唆されているように、onTouchEvent()の結果を常に渡すことが推奨されます。 –

1

あなたの活動にonTouchEventをオーバーライドしています。このメソッドでは、ScaleGestureDetectorにイベントを渡しますが、問題は、子ビューで処理されないタッチイベントのみがここに送信されることです。 children onTouch()メソッドでfalseを返しています。それは良いことです...あなたのアクティビティのonTouchEventを次に呼び出す必要があります。

子供のビューに送信するイベントを消費する場合は、ViewGroupのonInterceptTouchEvent(MotionEventイベント)を見てください。 http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)。ここで、イベントを消費する場合はtrueを返します。次のイベントがViewGroupのonTouchEventメソッドに送信されます。 falseを返すと、イベントはViewGroupの子に送信されます。

この方法を無効にするには、ViewGroupを拡張する必要があります。

質問が正しいかどうかを教えてください。可能であれば、私はもう少し手助けしようとすることができます

関連する問題