更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680
本篇文章自定义ViewGroup实现瀑布流效果来进行详解
dispatchTouchEvent ----- onInterceptTouchEvent----- onTouchEvent

最外层的ViewGroup首先接收到触摸事件,然后遍历他的子View或者ViewGroup,将触摸时间分发给包含触摸位置的子View,继续下去,直到该事件被消费(1.某个View的onTouchEvent返回了true;2.设置了监听并返回了true。这样该View的dispatchTouchEvent也就返回了true即事件被该View消费)onInterceptTouchEvent会拦截事件往下层传递,即中断事件传到子View,会执行自己的onTouchEvent。

下面的效果以前看到过,实现的思路挺不错的,算是对事件分发这些知识的实战吧。

 
 

在第一个listview里面上下滑动,由第一个listview分发事件。

在第二个listview里面上面滑动,三个listview均分发事件,实现一次触摸的联动效果。

在第二个listview里面的下面上下滑动,由第二个listview分发事件。

在第三个listview里面上下滑动,由第三个listview分发事件。

继承LinearLayot,拦截触摸事件,由自己重新分发。

public boolean onInterceptTouchEvent(MotionEvent ev) {
return true;
}
public boolean onTouchEvent(MotionEvent event) {
width = getWidth();
eventX = (int) event.getX();
childWidth = width / getChildCount();
if (eventX < childWidth) {
// 第一列的listview
event.setLocation(childWidth/2, event.getY());
getChildAt(0).dispatchTouchEvent(event);
}else if (eventX >childWidth && eventX < 2*childWidth) {
// 第二列的listview
event.setLocation(childWidth/2, event.getY());
if (event.getY() < getHeight()/2) {
// 第二列的listview上面
// 三个listview联动
for(int i = 0; i < getChildCount(); i++){
getChildAt(i).dispatchTouchEvent(event);
}
}else {
// 第二列的listview下面
getChildAt(1).dispatchTouchEvent(event);
}
}else {
//第三列listview
event.setLocation(childWidth/2, event.getY());
getChildAt(2).dispatchTouchEvent(event);
}
return super.onTouchEvent(event);
}

布局文件:

<com.example.day150214_pullstream.MyLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" > <ListView
android:id="@+id/lv1"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="1"
/>
<ListView
android:id="@+id/lv2"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="1"
/>
<ListView
android:id="@+id/lv3"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="1"
/> </com.example.day150214_pullstream.MyLayout>

MainActivity:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initList();
adapter = new SimpleAdapter(this, list, R.layout.item, new String[]{"iv"}, new int[]{R.id.iv});
lv1 = (ListView) findViewById(R.id.lv1);
lv2 = (ListView) findViewById(R.id.lv2);
lv3 = (ListView) findViewById(R.id.lv3);
lv1.setAdapter(adapter);
lv2.setAdapter(adapter);
lv3.setAdapter(adapter);
} private void initList() {
for (int i = 0; i < 20; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("iv", R.drawable.ic_launcher);
list.add(map);
}
}

更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680

高级UI晋升之自定义view实战(七)的更多相关文章

  1. 高级UI晋升之自定义View实战(六)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从Android 自定义属性动画&Camera动画来介绍自定义V ...

  2. 高级UI晋升之自定义View实战(九)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 1.前言: 本文采用自定义view的方法来实现一键清除的动画这个功能. 2.效果 ...

  3. 高级UI晋升之自定义View实战(五)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从自定义View利器Canvas和Paint来进行详解 一.Canvas ...

  4. 高级UI晋升之自定义View实战(八)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章自定义流式布局来进行介绍: 一般常见的流式布局由两种,一种是横向的个数固定 ...

  5. 高级UI晋升之常用View(三)中篇

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从ViewPager来介绍常用View:文章目录 一.简介 二.基本使用 ...

  6. 高级UI晋升之常用View(三)上篇

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下两个内容来介绍常用View: [RecycleView] [Ca ...

  7. 高级UI晋升之常用View(三)下篇

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从WebView来介绍常用View: 一.WebView介绍 Andro ...

  8. 高级UI晋升之View渲染机制(二)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 优化性能一般从渲染,运算与内存,电量三个方面进行,今天开始说聊一聊Android ...

  9. Android自定义View实战(SlideTab-可滑动的选择器)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/52178553 本文出自:[openXu的博客] 目录: 初步分析重写onDraw绘制 重写o ...

随机推荐

  1. web前端知识体系大全【转载】

    自己总结的web前端知识体系大全[欢迎补充]   1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在 ...

  2. 厉害了,Java EE 再次更名为 Jakarta EE

    来自:开源中国 https://www.oschina.net/news/108108/java-ee-rename-as-jakarta-ee Eclipse基金会最近对 Java EE 标准的每个 ...

  3. python面试题之请谈谈.pyc文件和.py文件的不同之处

    虽然这两种文件均保存字节代码,但.pyc文件是Python文件的编译版本,它有平台无关的字节代码,因此我们可以在任何支持.pyc格式文件的平台上执行它.Python会自动生成它以优化性能(加载时间,而 ...

  4. fusionCharts图表在客户端导出图片

    前提:要具备三个文件:FusionCharts.js / FusionChartsExportComponent.js / FCExporter.swf 1.引用 js 文件 <script t ...

  5. mySQL的表连接

    一.mysql表的连接方式 内连接和外连接的区别: 我把两个表比作集合A.B,其中,内连接是集合A和集合B的交集,而交集的内容在两个表中都存在,即在每一个表的内部:而外连接则是除了交集外,还有另一个表 ...

  6. css3中的scroll-behavior属性

    scroll-behavior属性 当用户手动导航或者 CSSOM scrolling API 触发滚动操作时,CSS 属性 scroll-behavior 为一个滚动框指定滚动行为,当用户通过鼠标滑 ...

  7. elasticsearch 嵌套对象之嵌套类型

    nested类型是一种特殊的对象object数据类型(specialised version of the object datatype ),允许对象数组彼此独立地进行索引和查询. 1. 对象数组如 ...

  8. android jni控制gpio (rk3288)

    1.添加驱动程序 2.编写jni c程序编译为库给java调用 3.app调用jni静态链接库操作底层驱动 1.添加驱动程序 修改/work/rk3288/firefly-rk3288_android ...

  9. 你了解SEO中的时效性吗?

    你了解SEO中的时效性吗? 本文摘自web前端早读课,侵删. 前言 最近刚好在负责一个新项目,App在还没上线的前提上,PC/WAP可以优先部署相关SEO,这样在后续的推广中得以运用.今日早读文章由腾 ...

  10. java23种设计模式(一)-- 工厂模式、抽象工厂模式和单例模式

    一.工厂模式 1.定义统一的接口,并在接口中定义要实现的抽象方法. 2.创建接口的具体实现类,并实现抽象方法. 3.创建一个工厂类,根据传递的参数,生成具体的实现类对象,执行具体的方法. 优点: 1. ...