我目前正在尝试获取一个自定义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) 我正在尝试检测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) 更新:我弄清楚发生了什么.看评论.
我正在尝试编写一个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) 以下是显示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
我正在制作一个自定义日历视图,它扩展了LinearLayout并为每个日期提供了子视图.我想要做的是处理滑动和点击,你可以想象,滑动用于更改月份,点击用于选择日期和显示新活动.为此,我在CalendarView上使用GestureDetector,可以使其适用于滑动.但是为了处理点击事件,我不知道如何找到发生了点击的子视图.
以下是我的代码的一部分.
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) 我有一个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) 我想要一个 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 …
我试图将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) 我正在制作一个以手势检测器为根的小部件,它的子项是一列,然后有多个不同的子视图,其中一些是文本字段,但手势检测器仅在我按下文本字段时才触发,尽管视图采用在颤振检查器中全屏显示这是我的构建方法
@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 方法,但目前如所述只有当我按下任何一个看起来很奇怪的文本视图时才会触发,有什么想法吗?
我正在尝试编写一个颤振测试并模拟双选项卡。但我无法找到办法。
这是我现在所做的:
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
gesturedetector ×10
android ×5
flutter ×5
callback ×1
click ×1
contextmenu ×1
dart ×1
double-click ×1
flutter-test ×1
navigation ×1
onfling ×1
scale ×1
swipe ×1
textview ×1
touch-event ×1
webview ×1
widget ×1