【转】重写ScrollView实现两个ScrollView的同步滚动显示

我们首先想到使用ScrollView的类似与setOnScrollChangedListener的方法来实现,当一个ScrollView滚动时,触发该方法进而使另外一个ScrollView滚动。不过很遗憾,谷歌没有提供该方法。通过查询相应的源代码,我们发现该方法的原型

protected void onScrollChanged(int x, int y, int oldx, int oldy)

该方法是protected类型,不能直接调用,于是需要重新实现ScrollView

首先,定一个一个接口(ScrollViewListener.java):

public interface ScrollViewListener { void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, intoldy);}

我们需要重写ScrollView才能实现该借口,因此有下面的代码(ObservableScrollView.java):

package com.devin;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;

public class ObservableScrollView extends ScrollView {

private ScrollViewListener scrollViewListener = null;

public ObservableScrollView(Context context) {
        super(context);
    }

public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

public void setScrollViewListener(ScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

@Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
        super.onScrollChanged(x, y, oldx, oldy);
        if(scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
        }
    }

}

接下来是界面的XML,这里是一个简单的Demo,如下(main.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#ffffff"
    android:orientation="horizontal" >

<com.devin.ObservableScrollView
        android:id="@+id/scrollview1"
        android:layout_width="400dp"
        android:layout_height="wrap_content" >

<LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="monday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="tuesday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="wednesday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="thursday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="friday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="saturday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="sunday"
                android:textColor="#000000" />
        </LinearLayout>
    </com.devin.ObservableScrollView>

<com.devin.ObservableScrollView
        android:id="@+id/scrollview2"
        android:layout_width="400dp"
        android:layout_height="wrap_content" >

<LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="monday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="tuesday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="wednesday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="thursday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="friday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="saturday"
                android:textColor="#000000" />

<TextView
                android:layout_width="wrap_content"
                android:layout_height="200dp"
                android:layout_weight="1"
                android:text="sunday"
                android:textColor="#000000" />
        </LinearLayout>
    </com.devin.ObservableScrollView>

</LinearLayout>

最后是我们的主程调用(PadTestActivity.java):

package com.devin;

import android.app.Activity;
import android.os.Bundle;

public class PadTestActivity extends Activity implements ScrollViewListener {

private ObservableScrollView scrollView1 = null;
    private ObservableScrollView scrollView2 = null;

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

scrollView1 = (ObservableScrollView) findViewById(R.id.scrollview1);
        scrollView1.setScrollViewListener(this);
        scrollView2 = (ObservableScrollView) findViewById(R.id.scrollview2);
        scrollView2.setScrollViewListener(this);
    }

public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {
        if(scrollView == scrollView1) {
            scrollView2.scrollTo(x, y);
        } else if(scrollView == scrollView2) {
            scrollView1.scrollTo(x, y);
        }
    }

}

【转】重写ScrollView实现两个ScrollView的同步滚动显示

时间: 2024-11-05 12:25:27

【转】重写ScrollView实现两个ScrollView的同步滚动显示的相关文章

Android实现两个ScrollView互相联动,同步滚动的效果

公众号:smart_android 作者:loonggg 点击"阅读原文",可查看很多其它内容和干货 近期在做一个项目,用到了两个ScrollView互相联动的效果,简单来说联动效果意思就是滑动当中的一个ScrollView还有一个ScrollView也一同跟着滑动,要做到一起同步滑动. 感觉在以后的项目开发中大家可能也会用到.绝对做个Demo分享出来,供大家一起学习,以便大家以后好用,觉的不错,实用的能够先收藏起来哦! 事实上对于ScrollView,Android官方并没有提供相关

ScrollView中嵌套ListView时,listview高度显示的问题

方法一:直接更改listview的控件高度,动态获取(根据条目和每个条目的高度获取) 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题.上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,因为默认情况下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是无法计

ScrollView向上滚动显示头部

项目中需要做一个类似手机QQ中查看个人资料,当向上滚动页面时候,头部的底色会根据滚动的距离渐变改变颜色. 看考了这个https://github.com/AChep/Header2ActionBar 库,但是这个库用了actionbar,而且在4.0-4.1的系统都无效.想必要做一个可以上下兼容的效果. 原理比较简单,重写ScrollView,添加onScrollChangeLisener,再根据滚动去调整颜色值. 关键代码: scrollview.setOnScrollChangedListe

tableview(scrollview)被拉动后能立即滚动到顶端

再仔细说下: 1:tableview滑动前,下面悬浮的按钮隐藏2:tableview被拉动后,下面悬浮的按钮出现,点击这个按钮tableview滚动到顶端.(便于分页加载多页后用户能立即滚动到顶端) - (void)viewDidLoad {    aTopBtn = [UIButton buttonWithType:UIButtonTypeCustom];    aTopBtn.frame = CGRectMake(ScreenWidth-50,ScreenHeight-64-105, 35,

java中重写Comparator对两个list集合排序

public class test{ public static void main(String[] args) { List<LeaveRequest>  LvRequestList=new List<LeaveRequest>(); List<OtRequest> otRequestList=new List<OtRequest>(); List   allList=new List(); allList.addAll( LvRequestList);

两个数据库表同步的可视化WEB同步程序

因业务升级,现有一个数据库中的表需要与先前项目中的表进行数据同步,停用先前的表,这两个表只能按其中相同的一个字段同步,认真研究了一下,用WEB程序进行了处理,可视化显示处理进度,同步操作结果.使用到的相关技术资料: 1.界面使用QUI(节省很多界面开发时间) 2.Jquery,AJax 同步请求(异步会有问题的) 3,吉日嘎拉底层数据库访问(可完美实现多种数据库表之间的同步,如目标数据库是MSSQL,源数据库是Oracle等) 前端截图:可视化显示处理进度及结果 前端部分JS 后台使用通用权限管

C#超简单方法实现两个richtextbox控件滚动条同步滚动

此文章属于作者原创,转载请注明,谢谢 有时候我们需要实现对照文章等,往往将文本放到两个richtextbox控件中,但是,如果我们需要同步滚动查看,来达到更好的观看效果. 当然,传统的方法重载控件或者自定义控件都可以达到目的,但是对于新手或者想仅仅只用一次这个控件的人来说,是非常麻烦的.所以,接 下来我来提供一种简单快捷的方法来实现:richtextbox滚动条同步的功能. 首先,我们在winform窗体创建两个richtextbox控件 下面介绍两个方法,我经常用到 第一个方法,获得当前鼠标所

lvds split两channel输出到一个屏显示

转:https://blog.csdn.net/changqing1990/article/details/81128552 其实之前写过LCD/LVDS的一些时序的基本概念<与LCD移植相关的概念>.但后来发现还是不够全面.关于双通道LVDS,可能会有很多人有一些陌生,它是什么原理? 有什么作用? 时序如何设定? 接下来, 就让我们带着这些问题去阅读下面的文章吧! 1. IMX LDB桥对LVDS 的支持情况:让我们先看一张imx6 TRM 中的图. IMX6 LVDS 桥提供两个LVDS通

当一个控制器中有两个scrollview,可以在不用多线程的条件下同时执行

self.timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];