在网上看到很多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中获得它。