先看下效果:
首先需要构造一个header部分,header部分分为固定header和滑动header,滑动header采用横向scrollview实现:
private void bindHeader(){ headerLiearLayout = new LinearLayout(context); headerLiearLayout.setOrientation(HORIZONTAL); LinearLayout.LayoutParams params = new LayoutParams(dp2px(75),rowHeight); params.gravity = Gravity.CENTER; for (String str:fixedList){ TextView tv = new TextView(context); tv.setText(str); tv.setTextColor(Color.WHITE); tv.setGravity(Gravity.CENTER); headerLiearLayout.addView(tv,params); } rightHeader = new LinearLayout(context); for(String str:movedList){ TextView tv = new TextView(context); tv.setText(str); tv.setTextColor(Color.WHITE); tv.setGravity(Gravity.CENTER); rightHeader.addView(tv,params); } headerLiearLayout.addView(rightHeader); addView(headerLiearLayout); }
下面列表部分使用listview:
private void buildListView(){ movableLayout = new LinearLayout(context); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); listView = new ListView(context); movableLayout.setLayoutParams(params); listView.setBackgroundColor(0xff9f9f9f); listView.setLayoutParams(params); movableLayout.addView(listView,params); addView(movableLayout,params); }
布局模式完成,现在关键是如何实现横向滑动,且只是部分内容横向滑动。
由于我们自己需要主动去滑动,因此我们需要监听滑动事件,并能区分是横向动作还是竖直动作,如果是竖直动作的话只需要交给listview实现就可以了,横向则需要我们自己主动去滑动部分子view,以下为事件的拦截及处理机制:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); if(action == MotionEvent.ACTION_MOVE && (mTouchState != TOUCH_STATE_RESET)){ return true; } int x = (int) ev.getX(); int y = (int) ev.getY(); switch (action){ case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; mTouchState = scroller.isFinished()?TOUCH_STATE_RESET:TOUCH_STATE_SCRONING; break; case MotionEvent.ACTION_MOVE: int deltaX = (int)Math.abs(lastX - x); int deltaY = (int)Math.abs(lastY - y); if(deltaX > deltaY ){ mTouchState = TOUCH_STATE_SCRONING; } break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: mTouchState = TOUCH_STATE_RESET; break; } return mTouchState != TOUCH_STATE_RESET; } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); int x = (int)event.getX(); if (velocityTracker == null) { velocityTracker = VelocityTracker.obtain(); } velocityTracker.addMovement(event); switch (action){ case MotionEvent.ACTION_DOWN: lastX = x; break; case MotionEvent.ACTION_MOVE: int deltaX = (int)(lastX - x); lastX = x; if(scroller != null && rightHeader != null){ scroller.startScroll((int)(rightHeader.getScrollX()),0,deltaX,0,0); invalidate(); } break; case MotionEvent.ACTION_UP: final VelocityTracker vt = velocityTracker; vt.computeCurrentVelocity(1000); int velocityX = (int) vt.getXVelocity(); int max = rightHeader.getChildAt(0).getWidth() * rightHeader.getChildCount() - rightHeader.getWidth(); scroller.fling(rightHeader.getScrollX(),0,-velocityX,0,0,max,0,0); invalidate(); if (velocityTracker != null) { velocityTracker.recycle(); velocityTracker = null; } mTouchState = TOUCH_STATE_RESET; break; case MotionEvent.ACTION_CANCEL: mTouchState = TOUCH_STATE_RESET; break; } return true; }
Scroll 是一个滚动控制器,在这里需要用它来实现横向滑动。注意startscroll和fling函数,看名字就知道了这里不多述,重要的一点是调用了该函数后,主动刷新view会条用completscroll函数(不明白的可以查看view的刷新机制),在这个函数中是实现真正的滑动部分:
@Override public void computeScroll() { if(scroller.computeScrollOffset()){ int scrollX = scroller.getCurrX(); final int maxX = rightHeader.getChildAt(0).getWidth() * rightHeader.getChildCount() - rightHeader.getWidth(); scrollX = Math.max(0,scrollX); scrollX = Math.min(maxX,scrollX); rightHeader.scrollTo(scrollX,0); scrollChildTo(scrollX); } }
在scrollchildTo函数中完成对listview中各个child的部分view的横向滑动:
protected void scrollChildTo(int mScrollX) { if(listView != null) { View temp = null; int nChildCount = listView.getChildCount(); for(int i = 0; i < nChildCount; i++) { temp = listView.getChildAt(i); int size = ((ViewGroup) temp).getChildCount(); for(int j = 0;j < size;j ++){ View item = ((ViewGroup) temp).getChildAt(j); if(item instanceof LinearLayout) { item.scrollTo(mScrollX, 0); } } } } }
这里的item布局可以看出,横向滚动部分使用linearlayout部分包裹,因此只需要让该view滚动即可.
最后就是适配器的处理了,基本上adapter跟普通的一样,不过有一点需要注意的是view的重用机制会造成最后一条滚动异常,我们需要加上一段矫正代码:
private void adjustMoved(View view) { View moveView = (View) view.findViewById(R.id.moveLayout); int moveX1 = moveView.getScrollX(); int moveX2 = ajustView.getScrollX(); if(moveX1 != moveX2){ moveView.scrollTo(ajustView.getScrollX(),0); } }
基本实现基本完成了,剩下的事情就是填充数据展示之类的。
抱歉,公司不能传代码,如果有需要的可以给我留言,我重新写一个完整的。
相关推荐
在Adapter中,需要将数据绑定到CardView上,并实现横向滑动效果的逻辑代码。具体实现方法可以根据实际情况进行调整。 使用RecyclerView和CardView可以实现横向卡片式滑动效果,提高Android应用程序的用户体验。...
微信小程序原生方式实现列表的横向滑动的两种方法: 效果图: 方式一:简单样式实现 父元素设置: white-space:nowrap;//不换行 overflow-x: auto;子元素设置: display:inline-block; 方式二:scroll-view 标签 + ...
本篇将深入探讨如何在HorizontalScrollView中嵌套一个可以横向滑动的GridView,以实现单行横向滑动的Demo。 首先,我们来理解HorizontalScrollView的基本用法。HorizontalScrollView是一个单行布局,它可以容纳多个...
本教程将深入讲解如何利用RecyclerView实现横向和纵向的分页滑动,充分利用Android原生功能。 首先,理解RecyclerView的基本结构。RecyclerView包含一个Adapter,它负责将数据集绑定到视图上,以及一个...
本文将深入探讨如何通过自定义控件实现横向滑动背景图的视差效果,这通常用于模仿真实世界中的深度感知,增强用户的沉浸感。我们将讨论以下几个方面: 1. **视差效果的理解**:视差效果是指当用户滚动或滑动界面时...
在Android开发中,实现一个横向滑动的日历视图是一个常见的需求,特别是在设计用户界面时,需要简洁且直观地展示日期。"Android横向滑动日历"是一个这样的示例项目,它专注于创建一个只显示一行日历的轻量级组件。...
为了实现横向滑动的GridView,我们可以使用HorizontalGridView或者自定义一个滚动方向可变的GridView。HorizontalGridView是Android SDK提供的一种特殊类型的GridView,专门用于实现水平方向的滚动。 以下是一些...
在Android开发中,横向滚动列表是一种特殊的视图组件,它允许用户水平滑动查看列表项,与传统的垂直滚动的ListView不同。这个功能通常用于展示有限的宽幅内容,如时间轴、标签栏或者图片轮播等场景。在本文中,我们...
在“android导航菜单横向左右滑动”的场景下,我们关注的是如何实现一个可左右滑动的水平滚动视图,即HorizontalScrollView,并与下方的控件进行联动交互。以下将详细介绍这一主题。 首先,HorizontalScrollView是...
然而,标准的ListView是垂直滚动的,有时我们可能需要实现一个可以横向滑动的列表,这通常是通过自定义View或者使用特定库来实现的。这篇博客“实现可以横向滑动的Listview”可能就是介绍了如何创建这样一个组件。 ...
【标题】"ViewPager横向滑动菜单的实现Demo"是一个典型的Android开发示例,它展示了如何利用ViewPager组件创建一个可以左右滑动切换的菜单界面。在Android应用开发中,ViewPager是Google提供的一个强大的视图切换...
本篇将深入探讨如何利用`ViewPager`和`GridView`来实现宫格横向滑动切换的分页效果。 首先,`ViewPager`是Android SDK中的一个强大的组件,它允许用户左右滑动来切换不同的页面,通常用于实现类似Tab布局的效果。`...
通过这个自定义控件,开发者不仅可以快速实现横向滑动列表的需求,还能减少代码的复杂性,提高开发效率。当然,如果想要进一步定制,如增加更多交互效果或优化性能,可能还需要对源码进行深入理解和修改。总之,这个...
**三、实现横向滑动** 默认情况下,RecyclerView已经支持水平滑动,但为了增强用户体验,可以添加手势检测和滑动效果: 1. **添加滑动手势** 使用`GestureDetector`监听用户的滑动事件,可以添加平移和平滑滚动的...
开发者常利用这一点来创建长列表或者需要用户横向滑动查看全部内容的场景。 **ViewPager** 是一个更高级的、专为实现页面滑动而设计的组件,通常用于实现类似翻页的效果。它通常与PagerAdapter一起使用,...
在很多场景下,我们可能需要实现RecyclerView的横向滑动,比如创建一个图片轮播器或横向滚动的菜单。这个“Android RecyclerView横向滑动+自动轮播”的Demo就是针对这种需求的一个优秀示例。 首先,我们要理解...
本教程将详细介绍如何通过代码实现RecyclerView的各种布局模式,包括横向滑动、纵向滑动、网格布局以及瀑布流。 首先,RecyclerView的核心组件包括RecyclerView对象、LayoutManager、Adapter和ViewHolder。...
在Android开发中,实现横向滑动翻页效果是构建用户界面的一个常见需求,尤其是在创建类似于电子书、图片浏览器或者卡片式布局的应用时。本实例将深入讲解如何在Android项目中实现这种效果,主要涉及的技术点包括...
在本教程中,我们将讨论如何结合`HorizontalScrollView`和`ListView`,实现一个可以水平滑动的列表视图。 首先,了解`HorizontalScrollView`的基本用法。`HorizontalScrollView`是一个单行布局,它只接受一个直接的...
它的主要特点是在横向滑动的列表中,当用户滑动到列表的边界时,可以通过释放手势触发加载更多内容的动画效果,这种设计在电商、新闻阅读等应用中非常常见。 在实现这个功能时,开发者需要考虑以下几个关键知识点:...