`

让两个HorizontalScrollView联动

阅读更多
有这样一个需求(相信股票列表会用的比较多,呵呵),需要当其中一个HorizontalScrollView滚动的时候另一个HorizontalScrollView也跟着滚动,所以才有了这个类:
package com.ql.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.HorizontalScrollView;

public class SyncHorizontalScrollView extends HorizontalScrollView{
	private View mView;
	public SyncHorizontalScrollView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}
	public SyncHorizontalScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	protected void onScrollChanged(int l, int t, int oldl, int oldt) {  
        super.onScrollChanged(l, t, oldl, oldt);  
        if(mView!=null){
            mView.scrollTo(l, t);
        }  
    }
	
	public void setScrollView(View view){
        mView = view;  
    }

}

用法:
scrollView0=(SyncHorizontalScrollView)findViewById(R.id.scrollView0);
scrollView1=(SyncHorizontalScrollView)findViewById(R.id.scrollView1);
scrollView0.setScrollView(scrollView1);
scrollView1.setScrollView(scrollView0);

这样其中一个滚动时另一个也跟着滚动了。
水平滚动解决了,那竖直滚动的ScrollView也类似的写法。

重写ScrollView实现两个ScrollView的同步滚动显示
http://www.cnblogs.com/devinzhang/archive/2012/07/13/2590222.html


还有一个问题:
如何让HorizontalScrollView总是停留在几个固定的位置?
比如HorizontalScrollView滚动到112位置的时候,需要判断它离100近还是200近,如果离100近就接着滚动到100的位置,否则滚动到200的位置。如何解决?


HorizontalScrollView可以解决Tab过多的问题
网上大多都是用Gallery来模拟TabHost 但是自己实在是懒 就没这么做 一种可以凑合着用的简单做法,只需要吧layout改一下即可:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/tabhost" 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#001629">
        <HorizontalScrollView  
        android:layout_width="fill_parent" 
      	android:layout_height="wrap_content"> 
         <TabWidget android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>
           </HorizontalScrollView>
             <FrameLayout android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingTop="95px">
 
        </FrameLayout>
</TabHost>
在TabWidget外面加上HorizontalScrollView即可。
不过 这样有个问题 宽度貌似改不了了 即使你只有一个tab 它并不会fill_parent 还是原来的宽度。(试试设置HorizontalScrollView的android:fillViewport="true")
但是 如果很多tab的话 还是好使的。



扩展HorizontalScrollView实现整个屏幕滚动
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=148434&fromuid=30206

http://www.jcodecraeer.com/a/opensource/2016/1130/6821.html

http://www.jcodecraeer.com/a/opensource/2017/0117/7048.html


https://github.com/Cleveroad/AdaptiveTableLayout
  • TestStock.zip (1.3 MB)
  • 描述: 附上股票列表伪代码
  • 下载次数: 12
分享到:
评论
4 楼 gundumw100 2011-11-30  
tfgjtf 写道
关于解决tab过多的问题。
按楼主的示例,我的代码怎么不起作用?请赐教,万分感谢!
代码如下:
java代码:
public class TabTestActivity extends TabActivity{
private ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
TabHost th=this.getTabHost();
LayoutInflater.from(this).inflate(R.layout.maintab2,th.getTabContentView(),true);
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));

}

}
xml代码:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"   
  android:id="@android:id/tabhost"
  android:layout_width="fill_parent"   
  android:layout_height="fill_parent">   
  <LinearLayout android:orientation="vertical"       
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <HorizontalScrollView    
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content">           
    <TabWidget android:id="@android:id/tabs"           
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />       
    </HorizontalScrollView>
    
    <FrameLayout android:id="@android:id/tabcontent"           
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">                               
      <!--省略部分代码-->           
      <TextView android:id="@+id/no_team_meetings"               
        android:textSize="18sp"
        android:layout_width="fill_parent"               
        android:layout_height="fill_parent" />           
      <TextView android:id="@+id/no_team_meeting_stats"               
        android:textSize="18sp"
        android:layout_width="fill_parent"               
        android:layout_height="fill_parent" />       
    </FrameLayout>   
  </LinearLayout>
</TabHost>

不推荐采用此种办法!
3 楼 tfgjtf 2011-11-30  
关于解决tab过多的问题。
按楼主的示例,我的代码怎么不起作用?请赐教,万分感谢!
代码如下:
java代码:
public class TabTestActivity extends TabActivity{
private ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
TabHost th=this.getTabHost();
LayoutInflater.from(this).inflate(R.layout.maintab2,th.getTabContentView(),true);
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));
th.addTab(th.newTabSpec("cancel5").setIndicator("未接电话5").setContent(R.id.no_team_meeting_stats));

}

}
xml代码:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"   
  android:id="@android:id/tabhost"
  android:layout_width="fill_parent"   
  android:layout_height="fill_parent">   
  <LinearLayout android:orientation="vertical"       
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <HorizontalScrollView    
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content">           
    <TabWidget android:id="@android:id/tabs"           
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />       
    </HorizontalScrollView>
    
    <FrameLayout android:id="@android:id/tabcontent"           
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">                               
      <!--省略部分代码-->           
      <TextView android:id="@+id/no_team_meetings"               
        android:textSize="18sp"
        android:layout_width="fill_parent"               
        android:layout_height="fill_parent" />           
      <TextView android:id="@+id/no_team_meeting_stats"               
        android:textSize="18sp"
        android:layout_width="fill_parent"               
        android:layout_height="fill_parent" />       
    </FrameLayout>   
  </LinearLayout>
</TabHost>
2 楼 xuhl2010 2011-09-20  
水平滚动解决了,那竖直滚动的ScrollView也类似的写法?
LZ怎么解决的?
我采用下面方法解决,但是如果快速滑动,会出现上下滑动不协调的问题!总体来说会互动!
view1.setOnTouchListener(new OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {

view2.onTouchEvent(event)  ;
//gridInfoView.dispatchTouchEvent(event);
return false;
}
});

view2.setOnTouchListener(new OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {
    
//gridNameView.onTouchEvent(event);
       view1.dispatchTouchEvent(event);
return false;
}
});
1 楼 maruoxuancake 2011-09-15  
引用
比如HorizontalScrollView滚动到112位置的时候,需要判断它离100近还是200近,如果离100近就接着滚动到100的位置,否则滚动到200的位置。如何解决?

同问,楼主解决没?

相关推荐

    android HorizontalScrollView和ViewPager联动效果

    本资源主要探讨了如何将这两个组件联动,尤其是在上下控件间实现平滑过渡,以及如何在联动过程中触发Activity之间的跳转。 HorizontalScrollView是一个可滚动的水平布局容器,它可以容纳一个或多个视图,并允许用户...

    HorizontalScrollView和ViewPager联动效果

    实现HorizontalScrollView和ViewPager的联动,首先需要理解两个组件的基本工作原理。HorizontalScrollView会在水平方向上滚动其子View,而ViewPager则负责管理一系列页面,并在用户滑动时切换页面。由于两者的滑动...

    android HorizontalScrollView和ViewPager联动效果新样式

    为了使HorizontalScrollView与ViewPager联动,我们需要自定义一个布局,这个布局中包含一个HorizontalScrollView和一个嵌套的ViewPager。 在自定义布局中,HorizontalScrollView将包含一系列的标题,每个标题对应...

    HorizontalScrollView ViewPager 导航菜单横向左右滑动并和下方的控件实现联动

    HorizontalScrollView和ViewPager是两个常用的组件,可以用来实现这种效果。本文将深入探讨如何利用这两个组件来构建一个横向左右滑动的导航菜单,并且与下方的控件实现联动。 HorizontalScrollView是一个可以容纳...

    HorizontalScrollView嵌套GridView实现水平滚动

    在XML布局文件中,你可以这样定义一个HorizontalScrollView: ```xml &lt;HorizontalScrollView android:layout_width="match_parent" android:layout_height="wrap_content"&gt; &lt;!-- 子视图 --&gt; &lt;/...

    ViewPagerTab:ViewPager + HorizontalScrollView实现联动效果

    `HorizontalScrollView`则是一个可以水平滚动视图的容器,它可以容纳一个或多个子视图,并让用户能够水平方向上滑动查看所有内容。 `ViewPagerTab`的实现主要涉及以下知识点: 1. **ViewPager的基本使用**: - ...

    android一个Activity中,多个listView的联动问题

    在这个场景下,开发者可能想要创建两个或更多ListView,其中一个可能是横向滚动,另一个是纵向滚动,以提供更丰富的用户体验。横向ListView通常通过`HorizontalScrollView`或自定义的`RecyclerView`实现,而纵向...

    轮子选择器(实现两级联动,城市选择等

    最后,确保在界面加载时初始化两个选择器,并填充初始数据。在`onCreate()`或`onResume()`方法中,加载省份和城市数据,并设置到对应的轮子选择器上。 博客文章...

    Android 两个gallery同时滑动

    当需要两个`Gallery`组件同时滑动时,我们可能希望实现一种联动效果,即在一个`Gallery`上滑动时,另一个`Gallery`也随之同步滑动。这在设计上可以提升用户体验,让用户在浏览多个关联内容时更加方便。 要实现这个...

    Dialog的demo+水平滑动demo+三级联动+MD demo

    开发者可能在这个Demo中学习到如何配置和控制这两个组件,以及如何处理滑动事件。 "自定义View的demo"是Android开发中的一个重要部分,因为系统提供的默认控件可能无法满足所有设计需求。自定义View允许开发者创建...

    Android代码-ScrollingTable

    &gt; Type1(使用两个列表):(左侧)RecycleView (右侧)【HorizontalScrollView RecycleView(使用GridLayoutManager)】 &gt; &gt; Type2(使用一个列表):RecycleView Item布局{(左边)TextView (右边)RecycleView} ...

    安卓listview相关相关-这款listview整合了包含下拉刷新上拉加载侧滑删除横向滑动联动嵌套等方法.rar

    嵌套滚动是Android API Level 21引入的一个特性,它允许两个可滚动视图在同一个方向上协同滚动。ListView与HorizontalScrollView或NestedScrollView的组合需要正确配置嵌套滚动属性,以实现平滑的用户体验。 以上...

    android日期滑动选择框

    在"二级联动"方面,这涉及到两个或更多选择框之间的交互。例如,当用户在第一个滑动选择框(如年份)中做出选择时,第二个滑动选择框(如月份)的内容会相应更新。这种联动关系可以通过监听第一个选择框的改变事件,...

    Android 高仿华为Tab页的滑动导航功能

    本教程将详细介绍如何利用LinearLayout和HorizontalScrollView这两种布局组件来实现这一功能。 首先,我们需要理解LinearLayout和HorizontalScrollView的基本概念。LinearLayout是一种线性布局,它可以按垂直或水平...

    Scrolldemo

    这两个方法都是View类中的成员,用于在现有位置上平移视图。 1. `scrollBy(x, y)`:这个方法用于在当前坐标基础上向右(x为正)或向左(x为负)平移视图的x轴距离,向上(y为正)或向下(y为负)平移y轴距离。这是...

    Android应用源码之横向导航滑动无限扩充.zip

    此压缩包包含两个主要文件:`androidDemo` 和 `Android应用源码之横向导航滑动无限扩充`,它们将深入展示如何构建一个可无限滚动的横向导航系统。 1. **HorizontalScrollView与ViewPager** - **...

    recycleview横向滚动加viewpage的级联滑动

    在Android开发中,RecycleView和ViewPager是两个非常重要的组件,它们被广泛用于构建高效、动态的用户界面。本文将详细探讨如何实现“RecycleView横向滚动加ViewPager的级联滑动”这一高级功能,以及从...

    ViewFillper+ViewFlow+ViewPager的使用方法

    ViewFlipper是Android SDK中的一个布局容器,它允许我们在两个或更多的视图之间进行自动或手动的切换。这个组件非常适合创建动画效果,比如广告轮播或动态显示多个视图。使用ViewFlipper的基本步骤包括: 1. 在XML...

Global site tag (gtag.js) - Google Analytics