我的应用程序包含一个按钮区域。我希望实现的功能是,通过在按钮区域上进行fling手势可以将其切换到另外两个区域(使用ViewFlipper)。
我使用了两种方法来检测手势。第一种方法涉及使用GestureDetector。然而,按钮上的触摸运动事件并没有触发onTouchEvent活动方法,因此,我无法将其转发到GestureDetector类。简而言之,失败了。
第二种方法涉及使用GestureOverlayView。这次,我达到了第二个极端:不仅检测到了手势,还有按钮,手势是在其上执行的。
我希望界面的工作方式如下:如果用户触摸按钮并释放触摸(或只移动手指很少),则按钮报告单击事件,并且不检测手势。另一方面,如果用户触摸屏幕并进行较长的移动,则应检测手势,并且按钮不会报告单击事件。
我已经实现了一个小型概念验证应用程序。活动XML代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical">
<android.gesture.GestureOverlayView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/overlay">
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<TextView android:id="@+id/display" android:layout_width="match_parent" android:layout_height="wrap_content" />
<Button android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/button"/>
</LinearLayout>
</android.gesture.GestureOverlayView>
</LinearLayout>
活动的Java代码如下:
package spk.sketchbook;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.gesture.*;
import android.gesture.GestureOverlayView.OnGestureListener;
public class Main extends Activity implements OnGestureListener, OnClickListener
{
private void SetupEvents()
{
GestureOverlayView ov = (GestureOverlayView)findViewById(R.id.overlay);
ov.addOnGestureListener(this);
Button b = (Button)findViewById(R.id.button);
b.setOnClickListener(this);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SetupEvents();
}
@Override
public void onGesture(GestureOverlayView arg0, MotionEvent arg1)
{
TextView tv = (TextView)findViewById(R.id.display);
tv.setText("Gesture");
}
@Override
public void onGestureCancelled(GestureOverlayView arg0, MotionEvent arg1)
{
}
@Override
public void onGestureEnded(GestureOverlayView overlay, MotionEvent event)
{
}
@Override
public void onGestureStarted(GestureOverlayView overlay, MotionEvent event)
{
}
@Override
public void onClick(View v)
{
TextView tv = (TextView)findViewById(R.id.display);
tv.setText("Click");
}
}
问题是:如何实现这样的接口,它可以决定是否将用户操作视为手势或按钮点击?
最好的问候 - Spook。