さて、ここでコードを参照しています: グリッドレイアウトでのジェスチャー検出のフリング
しかし、それを機能させることはできません。私の主な活動では、簡単な画像を定義しています。画像の飛びを検出したい。以下に私のコードを示します。下部のonclickメソッドは空です。これが原因ですか?他のコードサンプルでは必要なものではないため、空白のままにしました。私はただ、右に飛んでいるか左に飛んでいると言って、シンプルなトーストがポップアップしたいだけです。
public class GestureRightLeft extends Activity implements OnClickListener {
ImageView peek;
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private GestureDetector gestureDetector;
View.OnTouchListener gestureListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
peek =(ImageView) findViewById(R.id.peek);
peek.setImageResource(R.drawable.bluestrip);
gestureDetector = new GestureDetector(new MyGestureDetector());
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
}
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(GestureRightLeft.this, "Left Swipe", Toast.LENGTH_SHORT).show();
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(GestureRightLeft.this, "Right Swipe", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
// nothing
}
return false;
}
}
@Override
public void onClick(View v) {}
}
私が考えることができるフリンガーの最も簡単な作業バージョンは次のとおりです。 ImageViewだけでなく、実際に任意のコンポーネントに結び付けることができます。
public class MyActivity extends Activity {
private void onCreate() {
final GestureDetector gdt = new GestureDetector(new GestureListener());
final ImageView imageView = (ImageView) findViewById(R.id.image_view);
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(final View view, final MotionEvent event) {
gdt.onTouchEvent(event);
return true;
}
});
}
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private class GestureListener extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
return false; // Right to left
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
return false; // Left to right
}
if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
return false; // Bottom to top
} else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
return false; // Top to bottom
}
return false;
}
}
}
ただし、onClickListenerアクティビティはありません(onclickアクションをキャッチする必要がない場合)、水平だけでなく垂直もキャプチャします(必要ない場合は垂直部分を削除します)。メソッドが返される場所(私のコメントがある場所で)では、メソッドまたは何でも呼び出してください:)
これを試して
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return false;
}
return true;
}
});
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return !gestureDetector.onTouchEvent(event);
}
});
いくつかの前提条件
1)setonClick method
image.setOnClickListener(this);
2)set your gesture detection in onTouch()
image.setOnTouchListener(new OnTouchListener() {
GestureDetector gestureDetector = new GestureDetector(new SwingGestureDetection((mContext),image,a));
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});
3)create SwingGestureDetection class and implement all method
@Override
public boolean onFling(MotionEvent start, MotionEvent finish, float arg2,float arg3) {
if(start.getRawX()<finish.getRawX()){
System.out.println("next...swing");
}else{
System.out.println("previois...swing");
}
4)pass your imageview in constructor
public SwingGestureDetection(Context con,ImageView image,int pos) {
mContext=con;
this.image=image;
this.position=pos;
}
これは、me.ifクエリにコメントを追加するのに最適です。
読んでみてください: http://illusionsandroid.blogspot.com/2011/05/adding-fling-gesture-listener-to-view.html
これにより、アクティビティの実装をカスタムリスナーから分離できます。これは、Alex Orlovによって報告されたソリューションのリファクタリングです。
ImageView.setOnGestureListenerのようなメソッドを探している場合、何もありません。 Androidソースコードをご覧ください。最適なオプションは、ViewオブジェクトのonTouch()で処理することです。
これは、私が作成できる最も単純なGestureDetectorです。
GenesMotionDetector.Javaというクラスがあります。コードは次のとおりです。
package gene.com.motioneventssample;
import Android.app.Activity;
import Android.os.Bundle;
import Android.view.GestureDetector;
import Android.view.MotionEvent;
import Android.widget.ImageView;
import Android.widget.LinearLayout;
import Android.widget.TextView;
public class GenesMotionDetector extends Activity implements GestureDetector.OnGestureListener {
private GestureDetector gestureScanner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nothing);
gestureScanner= new GestureDetector(getBaseContext(),this);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
System.out.println("Inside onTouchEvent() of GenesMotionDetector.Java");
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
System.out.println("Inside onDown() of GenesMotionDetector.Java");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
System.out.println("Inside onFling() of GenesMotionDetector.Java");
return true;
}
@Override
public void onLongPress(MotionEvent e) {
System.out.println("Inside onLongPress() of GenesMotionDetector.Java");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
System.out.println("Inside onScroll() of GenesMotionDetector.Java");
return true;
}
@Override
public void onShowPress(MotionEvent e) {
System.out.println("Inside onShowPress() of GenesMotionDetector.Java");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
System.out.println("Inside onSingleTapUp() of GenesMotionDetector.Java");
return true;
}
}
そのクラスに対応するXMLレイアウトファイルはnothing.xmlです。コードは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/screen"
Android:orientation="vertical" Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:id="@+id/text"
Android:background="#17528c"
Android:text="testing"
Android:layout_width="100dp"
Android:layout_height="200dp" />
<ImageView
Android:id="@+id/image"
Android:background="#f8af20"
Android:layout_width="100dp"
Android:layout_height="200dp" />
</LinearLayout>
今、私が作ることができる最も簡単なGestureDetectorを(上から)取得し、あなたが望むものに合わせて変更すると、これが得られます:
package gene.com.motioneventssample;
import Android.app.Activity;
import Android.os.Bundle;
import Android.view.GestureDetector;
import Android.view.MotionEvent;
import Android.view.VelocityTracker;
import Android.view.View;
import Android.widget.ImageView;
public class GenesMotionDetector3 extends Activity implements GestureDetector.OnGestureListener {
private GestureDetector gestureScanner;
ImageView mView3;
View.OnTouchListener gestureListener;
MotionEvent initialME, finalME;
private VelocityTracker mVelocityTracker = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nothing);
mView3 = (ImageView) findViewById(R.id.image);
// Gesture detection
gestureScanner = new GestureDetector(getBaseContext(), this);
gestureListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
initialME= event;
if(mVelocityTracker == null) {
// Retrieve a new VelocityTracker object to watch the velocity of a motion.
mVelocityTracker = VelocityTracker.obtain();
}
else {
// Reset the velocity tracker back to its initial state.
mVelocityTracker.clear();
}
// Add a user's movement to the tracker.
mVelocityTracker.addMovement(event);
break;
case MotionEvent.ACTION_MOVE:
mVelocityTracker.addMovement(event);
// When you want to determine the velocity, call
// computeCurrentVelocity(). Then call getXVelocity()
// and getYVelocity() to retrieve the velocity for each pointer ID.
mVelocityTracker.computeCurrentVelocity(1000);
break;
case MotionEvent.ACTION_UP:
finalME=event;
break;
case MotionEvent.ACTION_CANCEL:
// Return a VelocityTracker object back to be re-used by others.
mVelocityTracker.recycle();
break;
}
return onFling(initialME, finalME, mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity());
//return false;
}
};
mView3.setOnTouchListener(gestureListener);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
System.out.println("Inside onTouchEvent() of GenesMotionDetector.Java");
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
System.out.println("Inside onDown() of GenesMotionDetector.Java");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
System.out.println("Inside onFling() of GenesMotionDetector.Java");
System.out.println("e1= "+ e1);
System.out.println("e2= "+ e2);
System.out.println("velocityX= "+ velocityX);
System.out.println("velocityY= "+ velocityY);
return true;
}
@Override
public void onLongPress(MotionEvent e) {
System.out.println("Inside onLongPress() of GenesMotionDetector.Java");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
System.out.println("Inside onScroll() of GenesMotionDetector.Java");
return true;
}
@Override
public void onShowPress(MotionEvent e) {
System.out.println("Inside onShowPress() of GenesMotionDetector.Java");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
System.out.println("Inside onSingleTapUp() of GenesMotionDetector.Java");
return true;
}
}
OnTouch()ですべてを処理することもできます。基本的に、onTouchでジェスチャーを取得し、onFling()に渡します。
ImageViewを使用してレイアウトを設計します。 setOnTouchListener
をimageView .imageview.setOnTouchListener(this)
。add。未実装のメソッドに追加View.OnTouchListener
。Then onTouch
メソッドは、ゲストのロジックを実装できます。このサンプルでは、左から右、右から左のゲストを示します。
float x1,x2;
float y1, y2;
@Override
public boolean onTouch(View view, MotionEvent event) {
switch ( event.getAction() ){
case MotionEvent.ACTION_DOWN:{
x1 = event.getX();
y1 = event.getY();
break;
}
case MotionEvent.ACTION_UP:{
x2 = event.getX();
y2 = event.getY();
if ( x1<x2 ) {
//implement what you need to do here
}
if ( x1>x2 ) {
//implement what you need to do here
}
break;
}
}
return false;
}
別のクラスを作成したり、コードを複雑にしたくない場合は、
OnTouchListener内でGestureDetector変数を作成するだけで、コードをより簡単にすることができます
namVyuVarは、listnerを設定する必要があるビューの任意の名前にすることができます
namVyuVar.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View view, MotionEvent MsnEvtPsgVal)
{
flingActionVar.onTouchEvent(MsnEvtPsgVal);
return true;
}
GestureDetector flingActionVar = new GestureDetector(getApplicationContext(), new GestureDetector.SimpleOnGestureListener()
{
private static final int flingActionMinDstVac = 120;
private static final int flingActionMinSpdVac = 200;
@Override
public boolean onFling(MotionEvent fstMsnEvtPsgVal, MotionEvent lstMsnEvtPsgVal, float flingActionXcoSpdPsgVal, float flingActionYcoSpdPsgVal)
{
if(fstMsnEvtPsgVal.getX() - lstMsnEvtPsgVal.getX() > flingActionMinDstVac && Math.abs(flingActionXcoSpdPsgVal) > flingActionMinSpdVac)
{
// TskTdo :=> On Right to Left fling
return false;
}
else if (lstMsnEvtPsgVal.getX() - fstMsnEvtPsgVal.getX() > flingActionMinDstVac && Math.abs(flingActionXcoSpdPsgVal) > flingActionMinSpdVac)
{
// TskTdo :=> On Left to Right fling
return false;
}
if(fstMsnEvtPsgVal.getY() - lstMsnEvtPsgVal.getY() > flingActionMinDstVac && Math.abs(flingActionYcoSpdPsgVal) > flingActionMinSpdVac)
{
// TskTdo :=> On Bottom to Top fling
return false;
}
else if (lstMsnEvtPsgVal.getY() - fstMsnEvtPsgVal.getY() > flingActionMinDstVac && Math.abs(flingActionYcoSpdPsgVal) > flingActionMinSpdVac)
{
// TskTdo :=> On Top to Bottom fling
return false;
}
return false;
}
});
});