• 自定义ViewGroup实现瀑布流效果


    今天情人节,我却在家里看书写代码,真屌丝啊哈~

    回顾:ViewGroup的时间分发流程:

    Android之View和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);
    		}
    	}
    




  • 相关阅读:
    Socket网络编程
    android开发常用颜色
    eclipse使用技巧以及开发安卓程序过程中遇到的问题
    XML文件中的常用属性
    将博客园的文本编辑栏属性变成可以粘贴
    显示单位px、dip、pt以及sp
    WIN32 API IP地址转换
    常用win32api函数
    win32—GrafMenu的CreateBitmapIndirect创建失败的问题
    #pragam 使用方法
  • 原文地址:https://www.cnblogs.com/qhyuan1992/p/5385335.html
Copyright © 2020-2023  润新知