标签: gesturedetector

Android:在自定义WebView中从onLongPress打开ContextMenu

我目前正在尝试获取一个自定义WebView,当它被按下较长时间时会显示一个ContextMenu.由于默认WebView类仅在链接为longPressed时显示ContextMenu,因此我编写了自己的类来覆盖此行为:

public class MyWebView extends WebView {
    Context context;
    GestureDetector gd;

    public MyWebView(Context context, AttributeSet attributes) {
        super(context, attributes);
        this.context = context;
        gd = new GestureDetector(context, sogl);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gd.onTouchEvent(event);
    }

    GestureDetector.SimpleOnGestureListener sogl =
                new GestureDetector.SimpleOnGestureListener() {

        public boolean onDown(MotionEvent event) {
            return true;
        }

        public void onLongPress(MotionEvent event) {
            // The ContextMenu should probably be called here
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

这可以正常工作,检测到longPress并调用onLongPress方法,但是在显示ContextMenu时我不知所措.我尝试在我的Activity中按照惯例进行操作:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout);

    MyWebView mwv = (MyWebView) …
Run Code Online (Sandbox Code Playgroud)

android contextmenu webview gesturedetector

5
推荐指数
1
解决办法
1万
查看次数

onFling for TextView无法正常工作

我正在尝试检测TextView对象的onFling事件.下面的代码适用于onDown事件,但它无法获取onScroll或onFling事件.有什么指针吗?

谢谢

package rob.testapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity
{
    private GestureDetector myGestDetector;
    private TextView mainTextView;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        myGestDetector = new GestureDetector(this, new SimpleOnGestureListener()
        {
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
            {
                mainTextView.setText("just scroll'n");
                return false;
            }

            @Override
            public boolean onDown(MotionEvent e1)
            {
                mainTextView.setText("on down");
                return false;
            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, …
Run Code Online (Sandbox Code Playgroud)

android textview onfling gesturedetector

5
推荐指数
1
解决办法
4821
查看次数

ScaleGestureDetector.OnScaleGestureListener.onScaleEnd()方法没有被击中

更新:我弄清楚发生了什么.看评论.

我正在尝试编写一个ViewSwitcher,它将所有手势传递给它的第一个孩子,直到它收到一个缩放手势; 然后它将它们传递给它的第二个孩子,直到那个孩子完全缩小,当它恢复到第一个孩子时.我的子类有一个ScaleGestureDetector,我做了一个非常简单的监听器:

    protected class OnScaleModeSwitcher implements ScaleGestureDetector.OnScaleGestureListener
    {
        protected PageFlipSwitcher owner;

        public OnScaleModeSwitcher(PageFlipSwitcher newOwner)
        {
            super();
            owner = newOwner;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            return false;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            owner.onScaleBegin();
//returning false here causes the rest of the gesture to be ignored.
            return false;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            owner.onScaleEnd();
        }
    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它所做的就是在构造时引用所有者对象,然后将一些事件传递给所有者类中的方法.但是,代码未访问onScaleEnd().

我知道onInterceptTouchEvent可能有点冒险; 我尽可能地按照Android文档中的建议进行操作

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev)
    {
        onTouchEvent(ev);
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev)
    { …
Run Code Online (Sandbox Code Playgroud)

android callback scale gesturedetector

5
推荐指数
1
解决办法
4102
查看次数

双击listview项目时获取所选项目

以下是显示listview项和onclick侦听器操作的代码.

ListView list = (ListView) findViewById(R.id.list);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                this, R.array.list,
                android.R.layout.simple_list_item_1);
        list.setAdapter(adapter);
        list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> l, View v, int position,
                    long id) {
                String sel = (String) adapterView
                            .getItemAtPosition(position);
                Toast.makeText(MyExample.this, "Your selection: " + sel, Toast.LENGTH_SHORT).show();
                if (sel.equals("Photos"){
                    startActivity(new Intent(MyExample.this, Photos.class));
                }   
            }

        });
Run Code Online (Sandbox Code Playgroud)

现在,我需要实现只在双击时选择列表项.我尝试使用GestureDetector如下:

GestureDetector gestureDectector = new GestureDetector(this, new GestureListener());        
list.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                gestureDectector.onTouchEvent(event);
                return true;
            }
        });



public class GestureListener extends GestureDetector.SimpleOnGestureListener { …
Run Code Online (Sandbox Code Playgroud)

android double-click ontouchlistener android-listview gesturedetector

5
推荐指数
1
解决办法
5742
查看次数

如何在父视图中处理子视图的触摸事件

我正在制作一个自定义日历视图,它扩展了LinearLayout并为每个日期提供了子视图.我想要做的是处理滑动和点击,你可以想象,滑动用于更改月份,点击用于选择日期和显示新活动.为此,我在CalendarView上使用GestureDetector,可以使其适用于滑动.但是为了处理点击事件,我不知道如何找到发生了点击的子视图.

  1. 有没有人有任何想法解决这个问题?
  2. OnScroll(MotionEvent)上返回true和false之间的区别是什么?

以下是我的代码的一部分.

public class MonthView extends LinearLayout implements GestureDetector.OnGestureListener {

    public MonthView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        gestureDetector = new GestureDetector(this);
        initDateViews();
    }

    //other codes here
    ....

    private void initDateViews() {
        for(int i = 0; i < 42; i++) {
            DateView view = new DateView();
            //init date views and add to calendar view.
            ....
            calendar.Add(view);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Logger.debug(TAG, ">>> MonthView.onTouchEvent()");

        return gestureDetector.onTouchEvent(event);
    }

    @Override
    public boolean OnSingleTapUp(MotionEvent event) …
Run Code Online (Sandbox Code Playgroud)

android click swipe touch-event gesturedetector

5
推荐指数
1
解决办法
4203
查看次数

在Flutter中将GestureDector添加到Listview.builder卡的正确方法?

我有一个Expanded小部件包裹在Listview.builder的Card.如何让我的卡不仅可以检测Listview.builder,还可以将变量传递给我在导航上的新.dart文件.我目前正在收到尺寸错误?

*更新代码*

这是我的代码......

new Expanded(
                child: new ListView.builder(
                    itemCount: id == null ? 0 : id.length,
                    itemBuilder: (BuildContext context, int index) {
                      return new Card(
                        child: new Column(
                          children: <Widget>[
                            new Image.network(video[index]),
                            new Padding(padding: new EdgeInsets.all(3.0)),
                            new Text(title[index],
                            style: new TextStyle(fontWeight: FontWeight.bold,
                            color: Colors.black),
                            ),
                            new GestureDetector(onTap: (){
                              print(id[index]);
                            },)

                          ],
                        ),
                      );

                    }))
Run Code Online (Sandbox Code Playgroud)

这是抛出的异常......

The following assertion was thrown during performLayout():
RenderPointerListener object was given an infinite size during layout.
This probably means that it is a …
Run Code Online (Sandbox Code Playgroud)

navigation widget gesturedetector flutter

5
推荐指数
2
解决办法
8417
查看次数

使用 GestureDetector 捕捉 MaterialButton 子节点的手势

我想要一个 MaterialButton 来检测 onTapDown、onTapUp 和 onTapCancel。

不幸的是,MaterialButtons 只检测 onPressed。所以我用 GestureDetector 包裹它,但对于 MaterialButtons,onPressed 是 @required 所以我将它设置为 () {}。问题是,即使我将 GestureDetector 行为设置为半透明,如果我点击按钮,只会触发 Button 的 onPressed 回调,并且我会丢失 GestureDetector 的 onTapDown 和 onTapUp 回调。如果我长按按钮,我只会触发 onTapDown,当我释放它时,会触发 onTapCancel。我永远无法以这种方式触发 onTapUp。

我仍然希望 MaterialButton 具有触觉/声音/视觉反馈功能。

我试图根本不设置 MaterialButton 上的 onPressed,并且(奇怪的是)它仍然有效,但该按钮被禁用并且根本没有提供任何反馈。

GestureDetector(
          behavior: HitTestBehavior.translucent,
          onTapDown: (_) {
            th.handleTap(i, 0);
          },
          onTapUp: (_) {
            th.handleTap(i, 1);
          },
          onTapCancel: () {
            th.handleTap(i, 2);
          },
          child: MaterialButton(
            onPressed: () {},
            child: Container(
              margin: EdgeInsets.all(5),
              child: Icon(icon),
            ),
          )
        )
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢 Hugo Passos,出于某种原因,我认为 MaterialButtons 永远不会向他们的孩子传递手势。我越来越近了,但我仍然不在那里:我发现匹配 Gesture …

gesturedetector flutter

5
推荐指数
1
解决办法
2303
查看次数

在TextFormField上捕捉点击事件

我试图将TextFormField上的tap事件捕获到flutter Form中.

我使用GestureDetector将TextFormField作为子元素进行操作,但点击它时没有任何东西触发:

@override
  Widget build(BuildContext context) {
    return new Scaffold(
      key: _scaffoldKey,
      appBar: new AppBar(title: const Text('Recherche de sorties')),
      body: new DropdownButtonHideUnderline(
        child: new Form(
          key: _formKey,
          autovalidate: _autovalidate,
          child: new ListView(
              padding: const EdgeInsets.symmetric(horizontal: 16.0),
              children: <Widget>[
                new DatePicker(
                  labelText: 'Date',
                  selectedDate: widget.request.dateDebut,
                  initialDate: widget.request.dateDebut,
                  firstDate: new DateTime.now().add(new Duration(days: -1)),
                  lastDate: new DateTime.now().add(new Duration(days: 365 * 4)),
                  selectDate: (DateTime value) {
                    setState(() {
                      widget.request.dateDebut = value;
                    });
                  },
                  datePickerMode: DatePickerMode.day,
                  icon: const Icon(Icons.date_range),
                ),
                new InputDecorator(
                  decoration: const …
Run Code Online (Sandbox Code Playgroud)

gesturedetector flutter

4
推荐指数
3
解决办法
3547
查看次数

Flutters 手势检测器 onTap 仅在文本子项上触发

我正在制作一个以手势检测器为根的小​​部件,它的子项是一列,然后有多个不同的子视图,其中一些是文本字段,但手势检测器仅在我按下文本字段时才触发,尽管视图采用在颤振检查器中全屏显示这是我的构建方法

      @override
      Widget build(BuildContext context) {
        return GestureDetector(
          onTap: (){
            print("tap");
            function(context);
          },
          child: Column(
            children: <Widget>[
              Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: buildTopDivider(),
              ),
              Container(
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Row(
                    children: <Widget>[
                      Expanded(
                        child: Padding(
                          padding: const EdgeInsets.only(right: 8.0),
                          child: Column(
                            children: buildTextFields(),
                          ),
                        ),
                      ),
                      Column(
                        children: buildIconContainer(),
                      ),
                    ],
                  ),
                ),
              ),
              Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: buildBottomDivider(),
              )
            ],
          ),
        );
      }
Run Code Online (Sandbox Code Playgroud)

并附上一个屏幕截图,显示手势检测器占据了整个视图,略有编辑但显示了问题,所以我希望能够按下此项目的任何位置并触发 onPress 方法,但目前如所述只有当我按下任何一个看起来很奇怪的文本视图时才会触发,有什么想法吗?

发出手势检测器

gesturedetector flutter

4
推荐指数
2
解决办法
6369
查看次数

如何在flutter测试中模拟onDoubleTap

我正在尝试编写一个颤振测试并模拟双选项卡。但我无法找到办法。

这是我现在所做的:

void main() {
  testWidgets('It should trigger onDoubleTap', (tester) async {
    await tester.pumpWidget(MaterialApp(
      home: GestureDetector(
        child: const Text('button'),
        onDoubleTap: () {
          print('double tapped');
        },
      ),
    ));

    await tester.pumpAndSettle();
    await tester.tap(find.text('button')); // <- Tried with tester.press too
    await tester.tap(find.text('button')); // <- Tried with tester.press too
    await tester.pumpAndSettle();
  });
}
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,我得到的是:

00:03 +1: All tests passed!                                                                                              
Run Code Online (Sandbox Code Playgroud)

double tapped但我在控制台中没有看到任何内容。


如何触发双击?

gesturedetector dart flutter flutter-test single-vs-double-tap

4
推荐指数
1
解决办法
1528
查看次数