SurfaceViewでのGestureDetectorとScaleGestureDetectorの共存について

810 views
Skip to first unread message

徳永

unread,
Feb 22, 2014, 8:27:27 PM2/22/14
to android-g...@googlegroups.com
はじめまして。徳永と申します。

SurfaceViewでのGestureDetectorとScaleGestureDetectorの共存について質問です。

シングルタッチとピンチを実装しようとしているのですが意図したように動作してくれません。

タップ時に
onDwon()
onShowPress()
onLongPress()
が呼び出されてしまいます。
2点タッチが検出されません。

参考にしたのは下記HPです。
上記のサンプルコードは正しく動作するのですが。。

下記のようにコードを実装しています。

MainActivity.java
-------------------------------------------------------------------------------------------------------------------------
package com.example.pinchtemplate;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//PinchTemplateのインスタンスを作成
PinchTemplate pinchTemplate = new PinchTemplate(this);

//PinchTemplateをアクティビティの画面に設定
setContentView(pinchTemplate);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}
-------------------------------------------------------------------------------------------------------------------------

PinchTemplate.java
-------------------------------------------------------------------------------------------------------------------------
package com.example.pinchtemplate;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ScaleGestureDetector;

public class PinchTemplate extends SurfaceView implements SurfaceHolder.Callback, Runnable,
GestureDetector.OnDoubleTapListener,
GestureDetector.OnGestureListener,
ScaleGestureDetector.OnScaleGestureListener{
Thread mainLoop = null;
Paint paint = null;
private ArrayList<String> info;
private GestureDetector mGestureDetector;
private ScaleGestureDetector mScaleGestureDetector;

public PinchTemplate(Context context) {
super(context);
//SurfaceView描画に用いるコールバックを登録する
getHolder().addCallback(this);

// 描画用の準備                                                                                                                                           
       paint = new Paint();                                                                                                                                      
       paint.setColor(Color.WHITE);                                                                                                                              
       paint.setStyle(Paint.Style.STROKE);                                                                                                                       
       paint.setTextSize(23);                                                                                                                                    
       paint.setAntiAlias(true);                                                                                                                                 

        // スレッド開始                                                                                                                                           
       mainLoop = new Thread(this);                                                                                                                              
       mainLoop.start();

//情報の生成
info = new ArrayList<String>();
info.add("PinchTemplate");
//ジェスチャーディテクターの生成
this.mGestureDetector = new GestureDetector(context, this);
this.mScaleGestureDetector = new ScaleGestureDetector(context, this);
//フォーカス指定
setFocusable(true);
Log.d("TEST",(String)info.get(0));
}

@Override
public void run() {
while(mainLoop != null){
Canvas canvas = null; 
try{
canvas = getHolder().lockCanvas();

if(canvas != null){
canvas.drawColor(Color.BLACK);

//情報の描画
for(int i=0; i<info.size() ; i++){
canvas.drawText((String)info.get(i), 0, 24+26*i, paint);
}
}
}
finally{
if(canvas != null){
getHolder().unlockCanvasAndPost(canvas);
}
}
}
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO 自動生成されたメソッド・スタブ
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
//SurfaceView生成時に呼び出されるメソッド
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO 自動生成されたメソッド・スタブ
}

//情報の追加
private void addInfo(String str){
info.add(0,str);
while(info.size()>30) info.remove(info.size()-1);
invalidate();
}

@Override
public boolean onTouchEvent(MotionEvent event){
if(mScaleGestureDetector != null){
final boolean is = mScaleGestureDetector.isInProgress();
mScaleGestureDetector.onTouchEvent(event);
if(is || mScaleGestureDetector.isInProgress()){
return true;
}
}
if(mGestureDetector != null){
return mGestureDetector.onTouchEvent(event);
}
return false;
}

@Override
public boolean onDown(MotionEvent e) {
// TODO 自動生成されたメソッド・スタブ
addInfo("Down");
Log.d("TEST","onDown");
return false;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
addInfo("Fling("+(int)velocityX+","+(int)velocityY+")");
return false;
}

@Override
public void onLongPress(MotionEvent e) {
addInfo("LongPress");
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
addInfo("Scroll("+(int)distanceX+","+(int)distanceY+")");
return false;
}

@Override
public void onShowPress(MotionEvent e) {
addInfo("ShowPress");
}

@Override
public boolean onSingleTapUp(MotionEvent e) {
addInfo("Up");
return false;
}

@Override
public boolean onDoubleTap(MotionEvent e) {
addInfo("DoubleTap");
return false;
}

@Override
public boolean onDoubleTapEvent(MotionEvent e) {
addInfo("DoubleTapEvent");
return false;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
addInfo("SingleTap");
return false;
}

//ここからScaleGestureDetector.OnScaleGestureListenerのインターフェース
@Override
public boolean onScale(ScaleGestureDetector detector) {
addInfo("onScale");
return false;
}

@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
addInfo("onScaleBegin");
return false;
}

@Override
public void onScaleEnd(ScaleGestureDetector detector) {
addInfo("onScaleEnd");
}
}
-------------------------------------------------------------------------------------------------------------------------

以上、よろしくおねがいします。

徳永

unread,
Feb 23, 2014, 9:08:34 AM2/23/14
to android-g...@googlegroups.com
すみません。
自己解決しました。

onDown()とonScaleBegin()でtrueを返すようにしたら
期待通りの動作をするようになりました。




Reply all
Reply to author
Forward
0 new messages