执行同步滚动型滚动位置 - 机器人机器人、位置

由网友(格子衫°小帅气、)分享简介:我有2 ScrollViews在我的Andr​​oid的布局。我如何可以同步自己的滚动位置?I have 2 ScrollViews in my android layout. How can I synchronise their scroll positions?推荐答案有一个在滚动型的方法... Ther...

我有2 ScrollViews在我的Andr​​oid的布局。我如何可以同步自己的滚动位置?

I have 2 ScrollViews in my android layout. How can I synchronise their scroll positions?

推荐答案

有一个在滚动型的方法...

There is a method in ScrollView...

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

不幸的是谷歌从来不认为我们需要访问它,这就是为什么他们把它保护的,并没有添加一个setOnScrollChangedListener挂钩。因此,我们必须做到这一点对我们自己。

Unfortunately Google never thought that we would need to access it, which is why they made it protected and didn't add a "setOnScrollChangedListener" hook. So we will have to do that for ourselves.

首先,我们需要一个接口。

First we need an interface.

package com.test;

public interface ScrollViewListener {

    void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);

}

然后,我们需要重写滚动型类,提供ScrollViewListener挂钩。

Then we need to override the ScrollView class, to provide the ScrollViewListener hook.

package com.test;

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);
        }
    }

}

我们应该在布局中指定,而不是现有的滚动型标签新ObservableScrollView类。

And we should specify this new ObservableScrollView class in the layout, instead of the existing ScrollView tags.

<com.test.ObservableScrollView
    android:id="@+id/scrollview1"
    ... >

    ...

</com.test.ObservableScrollView>

最后,我们把它放在一起,在布局类。

Finally, we put it all together in the Layout class.

package com.test;

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

public class Q3948934 extends Activity implements ScrollViewListener {

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

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

        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);
        }
    }

}

的scrollTo()code需要的任何环条件对我们照顾,所以我们并不需要担心。唯一需要注意的是,这个解决方案不能保证在Android的未来版本的工作,因为我们要覆盖一个受保护的方法。

The scrollTo() code takes care of any loop conditions for us, so we don't need to worry about that. The only caveat is that this solution is not guaranteed to work in future versions of Android, because we are overriding a protected method.

阅读全文

相关推荐

最新文章