scrollview的双列同步滚动问题

在网上看到很多scrollview的双列同步滚动的文章,有几篇给了我启发

http://www.cnblogs.com/devinzhang/archive/2012/07/13/2590222.html

作者将代码贴了出来,看的懂得自然懂,不过对于一些初学控件的人来说上手有些难度,这里为大家讲解一下。

有的同学知道要移动一个scrollview的滚动条可以使用 scrollTo()这个方法,不过前提是传入滚动的参数,使用这个函数解决问题没问题,不过在实现过程中我发现了一个地方,在mainActivity中使用scrollTo()的时候需要的参数 滚动到的坐标是不可见的,这个时候我又发现在scroll的内部是可以取到这个东西的,所以这里就需要用一个接口将scroll内部的滚动的坐标传递出来,之后赋予另外一个需呀滚动到特定地方的scrollview。


public interface ScrollViewListener {  
    void onScrollChanged(XScrollView scrollView, int x, int y, int oldx, int oldy);  
}  
MainActivity.java  
import android.app.Fragment;  
import android.app.FragmentTransaction;  
import android.content.res.Configuration;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.Display;  
import android.view.View;  
import android.view.ViewGroup;  
import android.view.ViewTreeObserver;  
import android.widget.Button;  
import android.widget.LinearLayout;  
import android.widget.ScrollView;  
import android.widget.Toast;  
  
import java.util.LinkedList;  
import java.util.Queue;  
  
public class MyActivity extends Activity  implements ScrollViewListener{  
    private final static String TAG="MyActivity";  
    private Activity mContext;  
    private int i=0;  
  
    private XScrollView scrollView1 = null;  
    private XScrollView scrollView2 = null;  
    private Fragment frg;  
    private Configuration config;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
  
        mContext = this;  
        scrollView1 = (XScrollView) findViewById(R.id.scrollView1);  
        scrollView1.setScrollViewListener(this);  
  
        scrollView2 = (XScrollView) findViewById(R.id.scrollView2);  
        scrollView2.setScrollViewListener(this);  
  
    }  
    @Override  
    public void onScrollChanged(XScrollView scrollView, int x, int y, int oldx, int oldy) {  
        //scrollView.computeScroll();  
        //此计算函数在高频的上下滚动view时候会产生异常导致程序奔溃  
        if(scrollView == scrollView1) {  
            scrollView2.scrollAndDo(x, y);  
        } else if(scrollView == scrollView2) {  
            scrollView1.scrollAndDo(x, y);  
        }  
    }  
}  
实现了onScrollChanged方法后,就可以将对scrollview的操作传入其本身的函数,之后在自定义的 scrollview中重写onScrollChanged() 方法,并调用这个onScrollChanged方法//下面是我的自定义scrollview   

XScrollView.java

import android.content.Context;  
import android.graphics.Canvas;  
import android.util.AttributeSet;  
import android.util.Log;  
import android.view.MotionEvent;  
import android.widget.ScrollView;  
  
public class XScrollView extends ScrollView {  
    private static final String TAG ="XScrollView";  
    private ScrollViewListener scrollViewListener = null;  
    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);  
        }  
    }  
  
    protected Context ctx=null;  
    public XScrollView(Context context) {  
        super(context);  
        ctx=context;  
        // TODO Auto-generated constructor stub  
    }  
  
    public XScrollView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        ctx=context;  
    }  
  
    public XScrollView(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
        ctx=context;  
    }  
  
    public void scrollAndDo(int x,int y){  
        this.scrollTo(x,y);  
    }  
}  




对了,要使用实现的接口中的函数在自定义的scrollchange中还需要定义个公共方法来在activity中获得它。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值