高级UI晋升之自定义view实战(七)
更多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实战(七)的更多相关文章
- 高级UI晋升之自定义View实战(六)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从Android 自定义属性动画&Camera动画来介绍自定义V ...
- 高级UI晋升之自定义View实战(九)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 1.前言: 本文采用自定义view的方法来实现一键清除的动画这个功能. 2.效果 ...
- 高级UI晋升之自定义View实战(五)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从自定义View利器Canvas和Paint来进行详解 一.Canvas ...
- 高级UI晋升之自定义View实战(八)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章自定义流式布局来进行介绍: 一般常见的流式布局由两种,一种是横向的个数固定 ...
- 高级UI晋升之常用View(三)中篇
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从ViewPager来介绍常用View:文章目录 一.简介 二.基本使用 ...
- 高级UI晋升之常用View(三)上篇
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下两个内容来介绍常用View: [RecycleView] [Ca ...
- 高级UI晋升之常用View(三)下篇
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从WebView来介绍常用View: 一.WebView介绍 Andro ...
- 高级UI晋升之View渲染机制(二)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 优化性能一般从渲染,运算与内存,电量三个方面进行,今天开始说聊一聊Android ...
- Android自定义View实战(SlideTab-可滑动的选择器)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/52178553 本文出自:[openXu的博客] 目录: 初步分析重写onDraw绘制 重写o ...
随机推荐
- Java享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern)主要用于减少创建的对象数量,并减少内存占用并提高性能. 这种类型的设计模式属于结构模式,因为该模式提供了减少对象计数的方法,从而改善应用的对象结构. 享元 ...
- python基本数据类型集合set操作
转:https://www.cnblogs.com/tina-python/p/5468495.html 一.集合的定义 set集合,是一个无序且不重复的元素集合. 集合对象是一组无序排列的可哈希的值 ...
- 调用Consul服务(消费服务)
调用Consul服务(消费服务) 依赖项 在spring-cloud-consul-client项目中添加依赖项,POM文件内容中添加如下依赖项: <dependency> <gro ...
- viewport的深入调研
1.viewport概念:viewport就是设备的屏幕上能用来显示我们的网页的那一块区域. viewport的默认值980px或1024px等,以下是浏览器的默认viewport宽度 2.css中的 ...
- [Fw] assembly code in gas syntax
Address operand syntax There are up to 4 parameters of an address operand that are presented in the ...
- 微软宣布加入 OpenJDK 项目
近日,微软的 Bruno Borges 在 OpenJDK 邮件列表中发布了一条消息,内容包含接下来发生的事情以及微软如何开始将其团队整合到 OpenJDK 社区.在邮件中,Bruno Borges ...
- Sql 将A表数据插入到B表
A表和B表字段不同 --insert into B(Name,PersonalId,Education,IsDel) select Name, PersonId as PersonalId, ( ca ...
- 四、yml文件的写法
1.创建一个新的工程 注意:只有properties文件,没有包含yaml文件 2.创建一个yml文件 全局配置配置文件,文件名是固定的application 作用:修改SpringBoot自动配置的 ...
- 大数据基础环境--jdk1.8环境安装部署
1.环境说明 1.1.机器配置说明 本次集群环境为三台linux系统机器,具体信息如下: 主机名称 IP地址 操作系统 hadoop1 10.0.0.20 CentOS Linux release 7 ...
- Tensorflow中的图(tf.Graph)和会话(tf.Session)详解
Tensorflow中的图(tf.Graph)和会话(tf.Session) Tensorflow编程系统 Tensorflow工具或者说深度学习本身就是一个连贯紧密的系统.一般的系统是一个自治独立的 ...