开发者

How to get the current Y offset of a ScrollView

开发者 https://www.devze.com 2023-01-09 05:39 出处:网络
ScrollView has a method for setting the x and y scroll offset, but no method for getting th开发者_运维问答e current offset (all I\'m really interested is the y offset, since ScrollView only supports v

ScrollView has a method for setting the x and y scroll offset, but no method for getting th开发者_运维问答e current offset (all I'm really interested is the y offset, since ScrollView only supports vertical scrolling). I don't see any method that would work in the superclasses, and tried getTop() for the content view, which is always zero. Am I missing something?


Call getScrollY() on the ScrollView

See here for the documentation: http://developer.android.com/reference/android/view/View.html#getScrollY%28%29


Why don't you try something like this ?

targetScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            int scrollX = targetScrollView.getScrollX();
            Log.d(TAG, "scrollX: " + scrollX);
        }
    });


If you are certain that you should get some value after using getScrollY() or getTop(), try to put those method inside a

yourScroolView.post(new Runnable() {
@Override
public void run() {
    Toast.makeText(getApplicationContext(),"Current Y is : "+getScrollY,Toast.LENGTH_SHORT).show();
            }
        });

Now it should work. According to my understanding about this method, it will only run after the layout being drawn. That can be one of the reason why you kept getting 0 previously. Hope it helps.


What about: computeHorizontalScrollOffset() and computeVerticalScrollOffset().


I achieve to get by the following. First get screen heigh and width.

DisplayMetrics metrics = getResources().getDisplayMetrics();
float screenWidth = metrics.widthPixels;
float screenHeight = metrics.heightPixels;

then to find out the document height (the total, what is being shown and what is out of the screen)

public float getDocumentHeight(){
    return (computeVerticalScrollRange() * screenHeight)/computeVerticalScrollExtent();
}

Finally to get the offset

public float getTopY(){
    return (getDocumentHeight() * computeVerticalScrollOffset())/computeVerticalScrollRange();
}

This give you the top of the window relative to the part of the document you are seeing so you could find the exact position of an event by

public boolean onTouchEvent(MotionEvent event) {
      int y = event.getY() + (int) getTopY();
    }

You can also do something similar to handle the width

0

精彩评论

暂无评论...
验证码 换一张
取 消