Android手势研究(textview及listview对比验证)(二)

在上文中我们对手势操作进行了基本验证,
我们将上文中添加第二个textview的改为添加Listview,代码如下:

ListView lv = new ListView(this);
lv.setBackgroundColor(0xff808080);
final String[] items = {"one", "two", "three"};
lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items));
mVf.addView(lv,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

执行ap,滑动屏幕切换到第二屏,可以看到第二屏被换成了一个ListView,
并且没有填充完整个屏幕,这时如果在底部非ListView区域向左滑动,
仍然可以切换到第一屏,但是在Listview区域滑动就没有效果了,
因为touch事件被Listview处理了,ViewFlipper无法收到touch事件也就无法进行手势判断。
我们给ListView也增加一个touch事件监听器,代码如下:

lv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mVfDetector.onTouchEvent(event);
}
});

此时在ListView上滑动也能实现屏幕切换了。
我们再给Listview增加响应点击事件的处理,代码如下:

lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
new AlertDialog.Builder(MainActivity.this)
.setMessage(items[arg2])
.create()
.show();
}
});

当点击Listview的条目的时候,就会弹出窗口显示点击了哪一项,此时的代码可参见附件1。
截止到此时,似乎Listview支持左右滑动的操作完成了,但实际上仍有两个问题:
首先就是滑动时,Listview有时会有条目被高亮,这个问题倒还不是太严重。
再次就是ContextMenu每次滑动都会被激活,我们可以通过代码验证,
创建ListView的代码稍作修改:

//使Listview长一些
final String[] items = {"one", "two", "three", "four", "five", "six", "sevent", "eight", "nine"};
registerForContextMenu(lv);

另外Activity的代码增加:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
menu.add("Menu 1");
menu.add("Menu 2");
menu.add("Menu 3");
super.onCreateContextMenu(menu, v, menuInfo);
}

当我们在ListView的某一项上长按时就会弹出菜单,
但是当滑动时,即使屏幕切换到了第一屏,此菜单仍然会弹出。
此时的验证代码参加附件2。
PS:现在的解决方法:

getListView().setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if( mDetector.onTouchEvent(event) ) {
MotionEvent cancelEvent = MotionEvent.obtain(event);
cancelEvent.setAction(MotionEvent.ACTION_CANCEL);
v.onTouchEvent(cancelEvent);
return true;
}
return false;
}
});

当判断出是手势事件后,用CANCEL事件吃掉就不会导致菜单弹出了。

为了解决上面的问题,我尝试了以下办法:
1.在ListView的touch事件监听函数中始终返回true,吃掉所有事件,
这样的修改导致不能相应点击,ListView不能上下滑动,此路不通。
2.在GestureDetector的fling函数中向ListView发送一个MotionEvent.ACTION_CANCEL事件,
总是空指针异常,怀疑是因为touch事件没有被ListView处理过,其内部成员状态异常,
于是我从ListView继承实现了一个ListView,在onTouchEvent中呼叫super.onTouchEvent,但是发送MotionEvent.ACTION_CANCEL事件时仍然是空指针异常,再次失败。
3.GestureDetector的onDown函数返回true,吃掉down事件,此时点击时没有高亮项了,
切换时contextmenu也不被trigger了,但是长按也无法弹出contextmenu了。
为了能弹出contextMenu,那么就要在GestureDetector的onLongPress函数中调用ListView.showContextMenuForChild()来弹出菜单,
那么GestureDetector就与ViewFlipper的不通用了,
所以我重新由ListView继承实现了一个类,这个类自身绑定了一个GestureDetector:

@Override
public boolean onDown(MotionEvent e) {
return true; //吃掉Down事件
}
@Override
public void onLongPress(MotionEvent e) {
System.out.println("Listview long press");
int position = pointToPosition((int)e.getX(), (int)e.getY());
if( position != ListView.INVALID_POSITION) {
View child = getChildAt(position - getFirstVisiblePosition());
if(child != null) GestureListView.this.showContextMenuForChild(child);
}
}

另外为了能够显示contextmenu时在哪一项上激活的,在Activity增加函数:

@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
System.out.println("View " + info.position + " context menu activited.");
return super.onContextItemSelected(item);
}

从LogCat即可看到打印输出。
此时此ListView可以响应手势、可以响应点击、可以弹出菜单,
基本的功能已经满足,另外再微调一下ondown函数,当点击时可以高亮一下。
最终代码可参见附件3。
PS:
最好的办法还是直接从AbsListView来修改,将左右方向手势判断加入进去,待研究。
Android SwipeRefreshLayout 原理与高可用实践指南 SwipeRefreshLayout 是 Android 中实现下拉刷新的标准控件,其本质是一个基于事件拦截与 ValueAnimator 驱动的 ViewGroup,通过封装手势识别、滚动状态判断和 Material 规范动画,为开发者提供开箱即用的刷新体验。它依赖 canChildScrollUp() 判断是否触发刷新,内部通过 mTarget 机制协调子 View 滚动行为,在 RecyclerView、NestedScrollView 等场景中需特别注意嵌套滚动兼容性。其技术价值在于极低的接入成本、 阅读详情

相关推荐

拼多多Android面试题及参考答案

Android 系统采用分层架构设计,从底层到上层依次为Linux 内核层硬件抽象层(HAL)系统运行时库层应用框架层应用层,共五层。位置:Linux 内核层与系统运行时库层之间,是“硬件与系统的隔离层”。核心作用:屏蔽硬件差异,为上层提供统一的硬件访问接口,解决 Android 开源与硬件厂商闭源的矛盾,具体功能如下:硬件能力抽象:将硬件的具体实现(如不同厂商的摄像头芯片、音频芯片)封装为标准化接口(如Camera HALAudio HAL。

大模型大数据攻城狮的专栏 1220

ListView 手势判断

ListView滑动 手势判断 自定义标题栏

手势锁,带登录和验证

模仿淘宝的手势密码解锁,带有登陆验证效果,下载即可用哦!

RecyclerView添加ContextMenu易错细节

RecyclerView是默认不能想ListView一样支持ContextMenu的,不过可以通过重写以下两个方法来实现ContextMenu:protected ContextMenu.ContextMenuInfo getContextMenuInfo(){...} @Override public boolean showContextMenuForChild(View origina

少晒太阳,如鱼得水 753

撸一个Vue手势验证码组件

手势验证码VAPTCHA 这是一种绘制轨迹进行人机的验证码,官网称为手势验证码。以下为官网说明: VAPTCHA是“Variation Analysis based Public Turing Test to Tell Computers and Humans Apart”(基于变量分析来区分人类和计算机的图灵测试程序)的缩写,又称为手势...

weixin_33918357的博客 1931

vaptcha-手势验证

vaptcha-手势验证

qq_44657571的博客 1850

ListView onItemLongClick 弹出ContextMenu

开发了一个简单的功能: 长按ListView中的item后, 弹出选择菜单: public class NetworktoolActivity extends Activity implements View.OnClickListener, AdapterView.OnItemLongClickListener{ boolean isSendItem = false; int

ansondroider的博客 1087

【转】Android手势研究textviewlistview对比验证)(

原文地址:http://mypyg.iteye.com/blog/761461   在上文中我们对手势操作进行了基本验证, 我们将上文中添加第textview的改为添加Listview,代码如下: Java代码   ListView lv = new ListView(this);    lv.setBackgroundColor(0xff808080);    ...

140

【转】Android手势研究textviewlistview对比验证)(一)

原文地址:http://mypyg.iteye.com/blog/761331   手势即手触摸屏幕做出动作。 View可以通过onTouchEvent收到触摸屏幕事件, 我们可以通过View.setOnTouchListener()设置事件监听器 或者override onTouchEvent()来拦截这些事件, 在拦截函数中判断触摸点的轨迹及运动速度就可以判断出是什么手势Android...

145

Android手势研究textviewlistview对比验证

手势即手触摸屏幕做出动作。 View可以通过onTouchEvent收到触摸屏幕事件, 我们可以通过View.setOnTouchListener()设置事件监听器 或者override onTouchEvent()来拦截这些事件, 在拦截函数中判断触摸点的轨迹及运动速度就可以判断出是什么手势Android系统提供了GestureDetector来方便手势判断,即

非著名程序员 1860

Android手势研究textviewlistview对比验证)(一)

手势即手触摸屏幕做出动作。 View可以通过onTouchEvent收到触摸屏幕事件, 我们可以通过View.setOnTouchListener()设置事件监听器 或者override onTouchEvent()来拦截这些事件, 在拦截函数中判断触摸点的轨迹及运动速度就可以判断出是什么手势Android系统提供了GestureDetector来方便手势判断,即:在拦截函...

mypyg的专栏 225

Android聊天消息列表实现精准文字复制与双击查看全文技术方案

Android应用开发中,文本选择与复制是基础交互功能,其核心原理基于TextView的文本选择机制和系统ActionMode。通过事件分发与手势识别技术,开发者可以解决复杂布局下的文本选择难题,提升用户体验。这一技术方案在IM、社交、办公类App中具有重要价值,能够实现类似微信聊天消息的精准复制和内容查看功能。本文深入探讨了Android事件冲突处理、自定义SelectionActionModeCallback以及GestureDetector的应用,帮助开发者构建更流畅的交互体验。

weixin_30920513的博客 317

如何利用uiautomator实现高效Android UI自动化测试:实战深度指南

在移动应用测试领域,Android UI自动化测试工具uiautomator为开发者提供了突破性的解决方案。这个Python封装的Android UI自动化框架,通过创新的设计理念和高效的实现机制,让Android设备交互变得前所未有的简单。uiautomator的核心价值在于它无需在Android设备上安装任何额外组件,仅通过ADB连接即可实现完整的UI自动化测试,这为移动应用质量保障提供了现代

gitblog_00905的博客 406

Android开源项目精选:解锁高效开发的完整生态工具箱

我们建议开发者将本项目作为**技术选型参考标准库**,在项目启动阶段快速定位所需组件。与传统零散搜索相比,这种结构化分类方式可节省70%以上的技术调研时间。项目维护者Trinea还提供了配套的**开发助手App**,支持反编译、布局查看、屏幕取色等实用功能,形成了完整的开发工具链生态。 ## 、核心架构设计理念:模块化分类与质量筛选机制 ### 2.1 四层分类体系架构 项目的核心创新在于

gitblog_00008的博客 777

Android事件分发机制:从原理到实战解决滑动冲突

Android应用开发中,UI交互的流畅性直接关系到用户体验,而触摸事件的处理是其中的核心。触摸事件从硬件层产生后,会经过一个由Activity、Window、ViewGroup和View构成的视图层级进行传递与处理,这一过程被称为事件分发机制。其本质是一个决策链与责任链的混合模型,核心在于理解dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent这三个方法的协作流程与调用顺序。掌握这套机制的技术价值在于,开发者能够从根本上诊断和修复诸如点击无响应、滑动

weixin_34122810的博客 307

Android RTL适配实战:从原理到第三方库兼容的完整指南

在移动应用国际化开发中,RTL(从右到左)布局适配是支持阿拉伯语、希伯来语等语言市场的关键技术挑战。其核心原理在于将传统的绝对“左右”思维转换为相对的“起始边(Start)”与“结束边(End)”概念,通过系统级的布局方向自动映射机制,实现UI的自动翻转。这项技术的价值在于保障了产品在全球市场的用户体验一致性与界面逻辑正确性,是拓展中东等地区市场的必备能力。在实际应用场景中,开发者不仅需要处理布局属性替换和方向性图标资源,更需应对自定义View绘制、动画手势以及第三方SDK兼容性等复杂问题。本文基于实战经验

weixin_34416649的博客 418

Android View 绘制流程与自定义 View 全解

Android View 绘制流程与自定义 View 全解

OuO-1 的博客 375

Android测试实战:单元测试、UI测试与Monkey测试构建应用质量防线

在软件开发领域,测试是保障应用质量、提升开发效率的核心工程实践。其基本原理在于通过预设的输入和预期输出,验证代码逻辑与功能的正确性,从而在早期发现并修复缺陷,降低后期维护成本。从技术价值看,一个完善的测试体系不仅能提升代码的健壮性和可维护性,还能支持团队进行快速、安全的迭代与重构。在Android应用开发场景中,测试实践尤为关键,它直接关系到用户体验的稳定性。具体而言,单元测试专注于验证业务逻辑等“原子”行为的正确性,而UI测试则模拟真实用户操作,确保界面交互流程无误。本文聚焦于Android测试的三大支柱

weixin_30568591的博客 409
上一篇: Android手势研究(textview及listview对比验证)(一)
下一篇: Android 自定义控件外观
mypyg
博客等级 码龄18年 3粉丝 43原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值