Spo*_*ook 8 user-interface android interface gestures clickable
我的应用程序包含一个填充按钮的区域.我希望以这种方式实现活动,按钮区域上的fling手势会将其切换到另外两个区域之一(使用ViewFlipper).
我在检测手势方面做了两种方法.第一个涉及使用GestureDetector.但是,Button上的触摸动作事件没有引发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>
Run Code Online (Sandbox Code Playgroud)
活动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");
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:如何实现这样一个界面,可以决定用户动作是否应被视为手势或按钮点击?
最好的问候 - 幽灵.
自己解决了。这个想法是从 GestureOverlayView 捕获手势事件,除了将它们传递给 GestureDetector 之外,还测量用户手势的距离。该距离应存储在私有活动的字段中(因此可供所有事件处理程序使用)。最后,fling 和 click 处理程序应检查该字段的值;如果低于某个值(例如,10 像素即可),则应将其解释为点击。否则 - 作为一种姿态。
请注意,该按钮看起来都已被单击,并且其单击处理程序将被调用。我决定创建一个低级单击处理程序(附加到 GestureOverlayView 上的所有按钮),它执行手势/单击检查,如果结果是单击,则选择较高级别的单击处理程序之一。
该解决方案对我有用;但是,如果希望禁用按钮的单击外观并阻止调用处理程序,则可能需要重新定义按钮和/或 GestureOverlayView 组件。