高级UI晋升之自定义view实战(七)

news/2025/2/27 4:25:28

更多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。

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

19956127-2cfaaadaae1c2d6b.png

在第一个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


http://www.niftyadmin.cn/n/545229.html

相关文章

赛门铁克完成收购Blue Coat 重塑未来网络安全

今日&#xff0c;全球网络安全领导厂商赛门铁克公司&#xff08;纳斯达克&#xff1a;SYMC&#xff09;宣布成功完成对Blue Coat公司的收购。Blue Coat是一家领先的网站安全服务提供商&#xff0c;在全球拥有众多企业和政府用户。这次收购将帮助赛门铁克进一步完善创新产品组合…

paip.输入法编程---输入法ATIaN历史记录 c823

paip.输入法编程---输入法ATIaN历史记录 c823 作者Attilax &#xff0c; EMAIL:1466519819qq.com 来源&#xff1a;attilax的专栏 地址&#xff1a;http://blog.csdn.net/attilax 7.24 ------------ 3500 单字,3000词组(全拼形式单声母形式) ------2013.7.27 wen缩写on,yen缩…

Android版俄罗斯方块的实现

学习Android的基本开发也有一段时间了&#xff0c;但是因为没有经常使用Android渐渐的也就忘记了。Android编程学的不深&#xff0c;仅仅是为了对付逆向&#xff0c;但是有时还是会感到力不从心的。毕竟不是一个计算机专业毕业的Coder&#xff0c;相对来说编程的基础对于以后很…

中国人工智能学会通讯——神经环路研究最新进展及对类脑计算的启示 2. 对数高斯分布的大脑连接强度...

2. 对数高斯分布的大脑连接强度 什么叫对数高斯分布&#xff1f;如果把这个分布取个对数就是高斯分布。它的尾巴没有刚才说的幂律分布长&#xff0c;但这种现象也很常见&#xff0c;为什么&#xff1f;有个很简单的原因&#xff0c;大家知道根据大数原则&#xff0c;如果把很多…

预编译指令

编译程序时&#xff0c;只要遇到 #error 就会跳出一个编译错误&#xff0c;既然是编译错误&#xff0c;要它干嘛呢&#xff1f;其目的就是保证程序是按照你所设想的那样进行编译的。 下面举个例子&#xff1a;程序中往往有很多的预处理指令#ifdef XXX...#else #endif 当程序比较…

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

更多Android高级架构进阶视频学习请点击&#xff1a;https://space.bilibili.com/474380680 本篇文章自定义流式布局来进行介绍&#xff1a; 一般常见的流式布局由两种&#xff0c;一种是横向的个数固定&#xff0c;列表按照竖向进行排列。另一种是横向先排&#xff0c;横向排…

远程IPC种植木马

要实现代码如下&#xff1a; / typedef struct TagHost { CString host; CString user; CString pass; CString filename; CString LocalFilePath; CListBox* list; }IPC; void CShareDlg::OnStart() //启动线程序 { UpdateData(TRUE); IPC* ipc new IPC; ipc->h…

HP Vertica企业大数据分析平台爆出远程提权漏洞 4.1及以后版本受影响 绿盟科技发布安全威胁通告...

Fortinet向HP提报了一个 hpe vertica大数据分析平台中的远程提权漏洞CVE-2017-5802&#xff0c;攻击者可以远程利用此漏洞获得特权访问。HP已经给出各版本的升级补丁。绿盟科技发布《 HPE Vertica Analytics Platform远程特权访问漏洞安全威胁通告 》&#xff0c;通告全文见下方…