多个Listview瀑布流效果
时间:2022-05-31
本文章向大家介绍多个Listview瀑布流效果,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
多个Listview瀑布流效果
效果展示
原理解释
自定义MyLinearLayout,继承至LinearLayout,在布局文件中,将3个listview放置在MyLinearLayout中。
重写MyLinearLayout中的onInterceptTouchEvent方法,返回true,打断向listview传递的触摸事件。
重写onTouchEvent方法,根据触摸位置,将触摸事件通过调用子view的dispatchTouchEvent方法,传递给相应位置的listview。
listview接受到触摸事件后就可以自行处理相关的滑动逻辑。
代码实现
界面布局
<jamffy.example.waterfalllistview.MyLinearLayout xmlns:android="http:// schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="jamffy.example.waterfalllistview.MainActivity" >
<ListView
android:id="@+id/lv1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:divider="@null"
android:dividerHeight="5dp"
android:scrollbars="none" >
</ListView>
<ListView
android:id="@+id/lv2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:divider="@null"
android:dividerHeight="5dp"
android:scrollbars="none" >
</ListView>
<ListView
android:id="@+id/lv3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:divider="@null"
android:dividerHeight="5dp"
android:scrollbars="none" >
</ListView>
</jamffy.example.waterfalllistview.MyLinearLayout>
自定义控件
/**
* @author tmac 如果不做处理MyLinearLayout中的子view能自行处理touch事件。
* 现在我希望当我在屏幕中间上方拖动时,整个屏幕的子view一起向上拖动,
* 这是就需要在满足条件时,中断该touch事件,交给MyLinearLayout这个父view来处理。
* 先中断所有子view的touch事件,然后根据触摸的位置,有父view把点击事件分发给相应的子view。
* 在分发之前需要给touch事件的对象event重新设置位置,因为子view的坐标系与父view是不同的。
*/
// 这个类专门为三个子listview服务。
public class MyLinearLayout extends LinearLayout {
public MyLinearLayout(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
// 返回true中断点击事件
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
return true;
}
@Override
// 用分发的方式决定哪个子view可以收到点击事件
public boolean dispatchTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int count = getChildCount();
// 每个子view的宽度
int width = getWidth() / count;
int height = getHeight();
// 当前触摸的位置
int currX = (int) event.getX();
int currY = (int) event.getY();
// 判断位置
if (currX < width) { // 处理最左边的逻辑
// 在分发之前需要给touch事件的对象event重新设置位置,因为子view的坐标系与父view是不同的。
event.setLocation(width / 2, currY);
getChildAt(0).dispatchTouchEvent(event);
return true;
} else if (currX < 2 * width) { // 处理中间的逻辑
if (currY > height / 2) { // 如果在下方,只移动中间的子view
event.setLocation(width / 2, currY);
getChildAt(1).dispatchTouchEvent(event);
return true;
} else {// 如果在上方,拖动三个view
event.setLocation(width, currY);
// 同时把touch事件分发给三个子view
for(int i=0;i<count;i++){
getChildAt(i).dispatchTouchEvent(event);
}
return true;
}
} else if (currX < 3 * width) { // 处理最右边的逻辑
event.setLocation(width / 2, currY);
getChildAt(2).dispatchTouchEvent(event);
return true;
}
return true;
}
}
完整代码
- 企业级Docker Registry开源工具Harbor的用户使用指南
- 后渗透工具Koadic:你真的了解我吗?
- Docker1.12尝试
- 颁奖乌龙就算了,怎么还性别歧视,好莱坞电影怎么了?数据笑而不语
- Python中关于集合(set)的思考
- 构建属于自己的原生docker images
- Docker-client for python使用指南
- Ansible基本配置以及使用示例
- redis超时原因系统性排查
- overlayfs存储驱动的使用以及技术探究
- 分页解决方案 之 分页算法——Pager_SQL的详细使用方法和注意事项
- 利用虚拟硬盘(把内存当作硬盘)来提高数据库的效率(目前只针对SQL Server 2000)可以提高很多
- 分页解决方案 之 分页算法——Pager_SQL的思路和使用方法
- 让你的笔记本更快一点——我的笔记本的性能测试和虚拟硬盘(把内存当成硬盘)的使用感觉
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法