zoukankan      html  css  js  c++  java
  • 高级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。

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

     
    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

  • 相关阅读:
    【数学】三分法
    【数学】【背包】【NOIP2018】P5020 货币系统
    【数学】【CF27E】 Number With The Given Amount Of Divisors
    【单调队列】【P3957】 跳房子
    【极值问题】【CF33C】 Wonderful Randomized Sum
    【DP】【CF31E】 TV Game
    【神仙题】【CF28D】 Don't fear, DravDe is kind
    【线段树】【CF19D】 Points
    【字符串】KMP字符串匹配
    【二维树状数组】【CF10D】 LCIS
  • 原文地址:https://www.cnblogs.com/Android-Alvin/p/11953070.html
Copyright © 2011-2022 走看看