文档章节

自定义控件(瀑布流,LinearLayout)

chenruibing
 chenruibing
发布于 2015/05/30 13:07
字数 523
阅读 925
收藏 1

通过转发触摸事件来单独对某个view进行控制处理。

<com.example.pinterestlistview.MyLinearLayout 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:id="@+id/mll"
    tools:context=".MainActivity" >

    <ListView
        android:id="@+id/lv2"
        android:scrollbars="none"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <ListView
        android:id="@+id/lv1"
        android:scrollbars="none"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <ListView
        android:id="@+id/lv3"
        android:scrollbars="none"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</com.example.pinterestlistview.MyLinearLayout>


dispatchTouchEvent  设置把触摸事件分发给那个view


package com.example.pinterestlistview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;

public class MyLinearLayout extends LinearLayout {


	public MyLinearLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		return true;
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		return super.dispatchTouchEvent(ev);
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		
		//每个控件,也就是每个listView占据的大小
		int width=getWidth()/getChildCount();
		int height = getHeight();
		//获取布局里面有多少个控件  这里则是有多少个listView
		int count=getChildCount();
		//获取触摸时焦点的位置
		float eventX = event.getX();
		
		if (eventX<width){	// 滑动左边的 listView
			//不知道有什么用,但是一定得加,好像是没有鼠标位置是不可以的
			event.setLocation(width/2, event.getY());
			//把焦点事件分发给左边的listView
			getChildAt(0).dispatchTouchEvent(event);
			return true;
			
		} else if (eventX > width && eventX < 2 * width) { //滑动中间的 listView  
			float eventY = event.getY();
			//焦点在上不部分  三个listView都滑动
			if (eventY < height / 2) {
				event.setLocation(width / 2, event.getY());
				for (int i = 0; i < count; i++) {
					View child = getChildAt(i);
					try {
						//三个listView都分发到焦点
						child.dispatchTouchEvent(event);
					} catch (Exception e) {
						e.printStackTrace();
					}
					
				}
				return true;
			} else if (eventY > height / 2) {
				event.setLocation(width / 2, event.getY());
				try {
					getChildAt(1).dispatchTouchEvent(event);
				} catch (Exception e) {
					e.printStackTrace();
				}
				return true;
			}
		}else if (eventX>2*width){
			event.setLocation(width/2, event.getY());
			getChildAt(2).dispatchTouchEvent(event);
			return true;
		}
		
		return true;
	}
	
}

MainActivity


package com.example.pinterestlistview;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;

public class MainActivity extends Activity {

	private ListView lv1;
	private ListView lv2;
	private ListView lv3;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		lv1 = (ListView) findViewById(R.id.lv1);
		lv2 = (ListView) findViewById(R.id.lv2);
		lv3 = (ListView) findViewById(R.id.lv3);

		try {
			lv1.setAdapter(new MyAdapter1());
			lv2.setAdapter(new MyAdapter1());
			lv3.setAdapter(new MyAdapter1());
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private int ids[] = new int[] { R.drawable.default1, R.drawable.girl1,
			R.drawable.girl2, R.drawable.girl3 };

	class MyAdapter1 extends BaseAdapter {

		@Override
		public int getCount() {
			return 3000;
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {

			ImageView iv = (ImageView) View.inflate(getApplicationContext(),
					R.layout.lv_item, null);
			int resId = (int) (Math.random() * 4);
			iv.setImageResource(ids[resId]);
			return iv;
		}
	}
}





© 著作权归作者所有

下一篇: 单个水波纹
chenruibing
粉丝 12
博文 203
码字总数 109101
作品 0
潮州
私信 提问
Android 类Pinterest 瀑布流实现方式 分享

oschina 中收录了类Pinterst 瀑布流的一个实现方式 http://www.oschina.net/p/android_waterfall 实现方式是ScrollView 嵌套多列LinearLayout ,通过计算当前图片与上下两屏距离来判断是否被...

Link_Yan
2012/12/20
9.9K
6
iOS开发-UICollectionView实现瀑布流

关于瀑布流的实现网上有很多种解法,自定义控件,TableView+ScrollView,UICollectionView是iOS6发布之后用于展示集合视图,算起来已经发布三年左右了,不过知识点是不变的,集合视图提供了一...

Daniel_s
2015/12/09
105
0
Android UI 之WaterFall瀑布流效果 [复制链接]

所谓瀑布流效果,简单说就是宽度相同但是高度不同的一大堆图片,分成几列,然后像水流一样向下排列,并随着用户的上下滑动自动加载更多的图片内容。 语言描述比较抽象,具体效果看下面的截图...

IT丶小生
2014/02/21
364
0
iOS学习之UICollectionView

今天,抽空巩固了一下UICollectionview这个UI控件。UICollectionview控件也是开发中经常使用到的一个控件,相比于UITableview,UICollectionview是iOS6之后引入的一个新的UI控件,它和UITab...

想不出一个
2018/08/03
0
0
安卓自定义控件全解

全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓自定义控件:包含LinearLayout、RelativeLayout、GridView、Button等 本文以LinearLayout为例 首先要有一个自定义xml布局文件 我们这里...

luanpeng825485697
2017/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

射频特征阻抗

Characteris Impendance(特性阻抗,也称为‘特征阻抗’)是我们经常看到并使用自己的术语之一,但非常模糊且难以解释。以下是来自几个不同来源的Characteris Impendance(特性阻抗)的一些定义。...

demyar
20分钟前
2
0
Spring Boot Tomcat配置项

参数配置容器 server.xx开头的是所有servlet容器通用的配置,server.tomcat.xx开头的是tomcat特有的参数,其它类似。 所有参数绑定配置类:org.springframework.boot.autoconfigure.web.Serv...

xiaomin0322
23分钟前
4
0
微课程 | 第二课《Docker 安装方式介绍》

微课程 | 第二课《Docker 安装方式介绍》视频 https://v.youku.com/v_show/id_XNDQ0NDUzNjkxNg==.html?spm=a2hzp.8244740.0.0 上一期我们介绍了 DBLE 的基本概况,下面进入我们的正题,正题基...

爱可生
24分钟前
4
0
GUAVA--基础工具(Preconditions)

1、前置条件 俗话说丑话讲在前面,在做某些事情的时候是需要做一些前置条件的。假如需要修改一条数据的话,当参数传进来,我们要先查询这条数据是否存在。这时候就需要一个if了,如果参数还需...

MrYuZixian
37分钟前
7
0
PythonSpot 中文系列教程 · 翻译完成

原文:PythonSpot Python Tutorials 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 在线阅读 ApacheCN 学习资源 目录 PythonSpot 中文系列教...

ApacheCN_飞龙
45分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部