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

  • 相关阅读:
    [android]Xutils具体介绍
    2015:WPS笔试-Android开发岗位
    BZOJ1355: [Baltic2009]Radio Transmission
    HDU 1421 搬寝室 (线性dp 贪心预处理)
    【独立开发人员er Cocos2d-x实战 009】Cocos2dx 菜单项CCMenu使用
    Error configuring application listener of
    SVN分支/合并原理及最佳实践
    SVN创建分支/合并分支/切换分支
    如何转载别人的文章
    让div自适应浏览器窗口居中显示
  • 原文地址:https://www.cnblogs.com/Android-Alvin/p/11953070.html
Copyright © 2011-2022 走看看