我使用下面的代碼來檢測視圖的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;
}
}
}
雖然ScaleGestureDetector onTouchEvent()總是返回true。 – mdupls 2012-04-30 15:43:24
這在當前版本中可能是正確的,但我們不應該依賴於SDK中類的實現。正如文檔所建議的,總是傳遞onTouchEvent()的結果是首選的做法。 – 2012-05-04 05:02:05