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