- 浏览: 156692 次
- 性别:
- 来自: 北京
最新评论
-
cys1314:
java 实现的公式计算 -
qq408170918:
楼主 请问下 “zip压缩包式皮肤” 这个 要怎么解压 怎么读 ...
应用换肤实现思路总结 -
蕾恩love:
Exception in thread "main& ...
Hadoop远程开发 -
unimme:
刚刚接触Jetty收-藏-了
jetty嵌入式配置总结 -
liuxuejin:
demo在那里呢??
aac解码器之郁闷
前几天写的复杂ListView的实现方式。
使用的场景:
在列表的item中存在例如workspace的view
package com.hyena.school.view; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.AbsListView; import android.widget.ListView; import android.widget.AbsListView.OnScrollListener; import com.hyena.framework.log.HyenaLog; /** * 列表 * @author yangzc * */ public class HyenaListView extends ListView implements OnScrollListener { private View mHidenHeaderView; private List<View> mStaticHeaderViews;//静态头,不响应触摸事件 public HyenaListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initListView(); } public HyenaListView(Context context, AttributeSet attrs) { super(context, attrs); initListView(); } public HyenaListView(Context context) { super(context); initListView(); } private void initListView() { mStaticHeaderViews = new ArrayList<View>(); this.setOnScrollListener(this); } /** * 隐藏的HeaderView * 这个View始终处于隐藏状态 * @param view */ public void setHidenHeaderView(View view){ mHidenHeaderView = view; this.addHeaderView(view); } /** * 静态的HeaderView * 这个View将不响应OnTouchEvent事件 * @param view */ public void addStaticHeaderView(View view){ mStaticHeaderViews.add(view); this.addHeaderView(view); } private int MAX_X_DISTANCE = 30; private int mDirection = NO_DIRECTION;//方向 private final static int NO_DIRECTION = 0; private final static int HORIZONAL = 1; private final static int VERTICAL = 2; private int mLastMotionX; private int mLastMotionY; /** * 处理静态View的手势识别 */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { HyenaLog.v("yangzc", "dispatchTouchEvent"); int x = (int) ev.getX(); int y = (int) ev.getY(); View touchView = getTouchingStaticHeader(x, y); if(touchView == null) return super.dispatchTouchEvent(ev); int action = ev.getAction(); switch(action){ case MotionEvent.ACTION_DOWN: mDirection = NO_DIRECTION; mLastMotionX = x; mLastMotionY = y; touchView.dispatchTouchEvent(ev); super.dispatchTouchEvent(ev); case MotionEvent.ACTION_MOVE: if(mDirection == VERTICAL) return super.dispatchTouchEvent(ev); if(mDirection == HORIZONAL){ touchView.dispatchTouchEvent(ev); return true; } if(Math.abs(mLastMotionX - x) > MAX_X_DISTANCE){ mDirection = HORIZONAL; }else if(Math.abs(mLastMotionY - y) > MAX_X_DISTANCE){ mDirection = VERTICAL; } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: mDirection = NO_DIRECTION; touchView.dispatchTouchEvent(ev); super.dispatchTouchEvent(ev); break; } return true; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { HyenaLog.v("yangzc", "onInterceptTouchEvent"); return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { HyenaLog.v("yangzc", "onTouchEvent"); if(mHidenHeaderView == null){ return super.onTouchEvent(ev); } int firstVisablePos = getFirstVisiblePosition(); View firstView = this.getChildAt(firstVisablePos); int bottom = firstView.getBottom(); int action = ev.getAction(); switch(action){ case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: if(firstVisablePos == 0 && bottom > 0){ int left = firstView.getLeft(); int right = firstView.getRight(); int height = firstView.getHeight(); firstView.layout(left, -height, right, 0); requestLayout(); } break; case MotionEvent.ACTION_CANCEL: break; } return super.onTouchEvent(ev); } /** * 当关联到Windows时执行 */ @Override protected void onAttachedToWindow() { if(mHidenHeaderView != null){ setSelection(1); } super.onAttachedToWindow(); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); //当点击返回键,然后重新拉起应用时定位到以一个合法的可见View scrollToFirstVisibleView(); } /** * 取得当前触摸到的静态View * @param x X坐标 * @param y Y坐标 * @return */ private View getTouchingStaticHeader(int x, int y){ int position = pointToPosition(x, y); if(mStaticHeaderViews.contains(this.getChildAt(position))){ return this.getChildAt(position); } return null; } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } /** * 滚动状态改变 */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch(scrollState){ case OnScrollListener.SCROLL_STATE_IDLE://空闲 case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL://滚动中 case OnScrollListener.SCROLL_STATE_FLING://滑动中 scrollToFirstVisibleView(); break; } } /** * 滚动到第一个可见View * * 如果当前List第一个可见区域为隐藏区域则定位到一个个可见区域 */ private void scrollToFirstVisibleView(){ int firstVisablePos = getFirstVisiblePosition(); View firstView = this.getChildAt(firstVisablePos); if(firstView == null)return; int bottom = firstView.getBottom(); if(firstVisablePos == 0 && bottom > 0){ setFastScrollEnabled(false); int left = firstView.getLeft(); int right = firstView.getRight(); int height = firstView.getHeight(); firstView.layout(left, -height, right, 0); requestLayout(); } } // private void cancelFling(){ // try { // Field field = AbsListView.class.getDeclaredField("mFlingRunnable"); // Object obj = field.get(null); // Method method = obj.getClass().getDeclaredMethod("endFling", new Class[0]); // method.invoke(obj); // } catch (SecurityException e) { // e.printStackTrace(); // } catch (NoSuchFieldException e) { // e.printStackTrace(); // } catch (IllegalArgumentException e) { // e.printStackTrace(); // } catch (IllegalAccessException e) { // e.printStackTrace(); // } catch (NoSuchMethodException e) { // e.printStackTrace(); // } catch (InvocationTargetException e) { // e.printStackTrace(); // } // } }
发表评论
-
方便好用的自定义按钮按下效果
2013-07-01 12:08 1403public static StateListDrawabl ... -
分享一下
2013-03-08 17:43 1126http://www.cnblogs.com/DreamSea ... -
aac解码器之郁闷(二)
2012-08-21 15:05 5864扫盲 AAC实际上是高级音频编码的缩写, ... -
flash打包
2012-06-29 12:40 1381輕鬆學會用Adobe Flash ... -
Activity的启动模式(android:launchMode)
2012-05-16 10:31 1399standard 每次都会新建,每个Task都可以有, ... -
网上发现的3D Gallery效果
2012-04-10 16:19 1853看了看效果,跑了一下。感觉还不错。 作者不知道是谁了, ... -
报表,折线图
2012-04-10 13:14 1440前几天为了实现类window资源管理器的效果实现了这个折线图。 ... -
View 3D旋转
2012-04-10 13:08 1588没事自己写的: package com.zgy.and ... -
取得系统支持的所有音频格式
2012-03-14 20:54 1291try { // Method method = Cla ... -
handler源码分析
2012-03-01 21:24 1624昨天研究了一下Handler的源码,今天总结一下: a ... -
很久发博客了,发个最近写的一个方法吧。
2012-01-05 22:08 1194/** * 设定按钮动作 * @param nor ... -
自定义绝对布局的实现
2012-01-05 22:01 2371android 绝对布局已经过期了为了保证稳定性自定义了一个绝 ... -
aac解码器之郁闷
2011-10-07 10:52 2544扫盲 AAC实际上是高级音频编码的缩写,它是M ... -
91手机助手、豌豆荚自动安装驱动实现方式技术调研总结
2011-07-30 23:37 7960本帖强烈要求扔砖头。 因为工作需要调研一下91手机助手 ... -
换肤实现思路(二)
2011-07-09 12:31 2486以前写过一个关于皮肤的换肤思路的博客。但那个里边主要是针对于资 ... -
ContentProvider的实现
2011-07-09 12:28 3363这几天有些忙,要做关于访问exchange服务器的技术调研,环 ... -
应用换肤实现思路总结
2011-07-01 23:14 3996注:以下所有言论纯属个人主观分析。 换肤解决方案:1. ... -
widget开发实例代码
2011-06-28 21:44 1692其实创建一个widget很简单。这里就做了一个简单的demo, ... -
android应用之--我的微博
2011-06-26 15:53 1566用了一个周六周日,做了一个简单的新浪微博。后续功能还要加入腾讯 ... -
androidpn的一次亲密接触(二)
2011-06-22 22:46 6403简单看了一下源码的实现,这里贴一点个人觉得比叫重要的代码。 ...
相关推荐
标题"横向listview和纵向listview相结合"所描述的就是如何在Android应用中集成这种复合滑动效果。 首先,我们要理解ListView的基本工作原理。ListView通过Adapter来填充数据,每个Adapter项被渲染为一个View,用户...
这将使ListView控件使用复合窗口样式,有助于消除闪烁。 2. 集中批量添加数据 尽量避免频繁单个添加或删除项,而是应该一次性添加一个数据集合,通过BeginUpdate()和EndUpdate()方法来控制ListView在添加过程中不...
在VB6中,用户控件(User Control)是一种可以封装多个基本控件和自定义逻辑的复合控件,便于复用和扩展。在这个目录下,开发者可以找到自定义ListView控件的定义和实现,包括其事件处理、属性和方法。 `Forms`目录...
4. **适配器设计**:设计一个复合适配器,将内部GridView的适配器逻辑整合到外部ListView的适配器中。适配器的getView()方法应根据数据类型返回不同的视图(ListView项或GridView)。 在实际开发中,还应注意以下几...
例如,你可以使用 `ItemsSource` 属性绑定数据源,并通过 `ItemTemplate` 定义每一项的显示模板,如示例中的 `StackPanel` 结合 `Image`、`TextBlock` 和 `CheckBox` 创建复合内容。 ```xml ``...
在Android开发中,"在ListView里面嵌套Gallery"是一个常见的需求,这涉及到UI组件的复合使用,以实现更丰富的交互效果。ListView是Android系统提供的一个列表视图控件,它可以展示大量的数据项,并且支持滚动操作。...
##### 3.3 复合解决方案 为了确保`ListView`总是能够响应点击事件,通常会结合以上两种方法使用: 1. 将子视图的`focusable`属性设置为`false`。 2. 将`descendantFocusability`属性设置为`blocksDescendants`。 ...
通过以上步骤,我们可以创建出一个既具有ListView的列表展示能力,又拥有Gallery的横向滑动选择功能的复合控件。这种设计不仅提升了用户体验,也为开发者提供了更大的灵活性和创新空间。在实际项目中,可以根据业务...
总结来说,“listview内嵌gridview”是一种复合布局的实现方式,通过组合使用两种强大的列表控件,可以创造出更灵活、更丰富的界面。在实际项目中,根据需求合理地利用这种设计模式,可以提高应用的用户体验和视觉...
标题“ViewPager嵌套ListView实现上拉和下拉刷新”揭示了一个关键的技术点,即如何在这样的复合组件中集成下拉刷新和上拉加载更多的功能。这种设计允许用户滚动查看更多的内容,同时提供了流畅的用户体验。 首先,...
- 如果相册Demo中有图片描述,可能还需要处理文字的对齐和换行,这可能涉及到LinearLayout、RelativeLayout或ConstraintLayout等复合布局。 7. **交互设计** - 用户交互设计是相册应用的重要组成部分,比如点击...
此项目实现的核心在于ListView内嵌GridView,这是一个复合视图的组合,能够有效地展示多级信息。下面我们将深入探讨这个主题。 首先,`ListView`是Android中最常用的列表控件,它可以动态加载大量数据并进行滚动,...
后端接收到这两个参数后,结合它们进行复合条件的查询。 分页处理通常是在视图中完成的,例如,你可以使用`request.GET.get('page', 1)`来获取请求中的页码,如果没有提供,就默认为第一页。在分页链接中,需要包含...
通过使用`TemplateContainer`属性,复合控件可以支持模板,就像`Repeater`或`ListView`控件一样。这使我们可以定义内容区,并让用户自定义这些区域。 6. **自定义属性和事件** 为了增加功能,可以定义自定义属性...
CListCtrl是MFC(Microsoft Foundation Classes)库中的一个类,它是Windows API中的ListView控制的面向对象封装。虽然标准的CListCtrl已经很强大,可以显示文本、图像甚至子项,但在某些情况下,开发者可能需要更...
本教程将深入探讨“android UI布局”,特别是表单控件、复合控件的使用,以及如何实现ListView、GridView和Gallery等控件。我们将通过具体的代码示例来帮助你理解和掌握这些知识点。 首先,我们来看表单控件。表单...
您可以在视图内部实现自己的ScrollView,ListView,Multiple View等...,并将自己的视图设置为“ flex:1”。 对于下面的演示屏幕,根据滚动自动跳转的与该库无关。 它与我自己的实现有关,这是另一个故事,并且...
1. **TreeListView控件**: TreeListView是WPF中的一个复合控件,继承自ListView,它在呈现数据时既保留了TreeView的层次结构,又具备ListView的列布局。通过使用HierarchicalDataTemplate,可以轻松地将层次数据绑定...
在Android应用开发中,当前流行的设计趋势之一是采用带有底部导航菜单(Bottom Navigation)的主界面,辅以页面左右滑动的效果,以及ListView内嵌GridView的复合视图展示。这样的设计不仅提供了良好的用户体验,还...
1. **OLE技术**:OLE(Object Linking and Embedding)是微软提出的一种复合文档技术,它允许在一个文档中嵌入或链接另一个文档,使得不同应用间的交互成为可能。在拖放操作中,OLE被用来处理数据的传输和转换,使得...