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中獲得它。



發佈了43 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章