Android: làm cách nào để kiểm tra xem Chế độ xem bên trong ScrollView có hiển thị không?


168

Tôi có một ScrollViewtrong đó giữ một loạt Views. Tôi muốn có thể xác định xem một chế độ xem hiện đang hiển thị (nếu bất kỳ phần nào của nó hiện đang được hiển thị bởi ScrollView). Tôi hy vọng mã dưới đây sẽ làm điều này, đáng ngạc nhiên là nó không:

Rect bounds = new Rect();
view.getDrawingRect(bounds);

Rect scrollBounds = new Rect(scroll.getScrollX(), scroll.getScrollY(), 
        scroll.getScrollX() + scroll.getWidth(), scroll.getScrollY() + scroll.getHeight());

if(Rect.intersects(scrollBounds, bounds))
{
    //is  visible
}

Tôi tò mò làm thế nào bạn có được điều này để làm việc. Tôi đang cố gắng làm điều tương tự nhưng ScrollView chỉ có thể lưu trữ 1 con trực tiếp. "Chuỗi lượt xem" của bạn có được bao bọc trong một bố cục khác bên trong ScrollView không? Đó là cách tôi đặt ra nhưng khi tôi làm điều đó thì không có câu trả lời nào ở đây làm việc cho tôi.
Dậu242

1
Có, một loạt các chế độ xem của tôi nằm trong một linearLayout, là con 1 của ScrollView. Câu trả lời của Qberticus đã làm việc cho tôi.
ab11

Câu trả lời:


65

Sử dụng View#getHitRectthay vì View#getDrawingRecttrên quan điểm bạn đang thử nghiệm. Bạn có thể sử dụng View#getDrawingRecttrên ScrollViewthay vì tính toán một cách rõ ràng.

Mã từ View#getDrawingRect:

 public void getDrawingRect(Rect outRect) {
        outRect.left = mScrollX;
        outRect.top = mScrollY;
        outRect.right = mScrollX + (mRight - mLeft);
        outRect.bottom = mScrollY + (mBottom - mTop);
 }

Mã từ View#getHitRect:

public void getHitRect(Rect outRect) {
        outRect.set(mLeft, mTop, mRight, mBottom);
}

35
Tôi nên gọi phương pháp này ở đâu?
Tooto

3
@Qberticus Làm thế nào để gọi các phương thức? Tôi đang sử dụng nó và nó luôn luôn trả lại sai. Xin vui lòng cho tôi biết
KK_07k11A0585

2
Chính xác thì gọi những phương thức này ở đâu?
viêm zema

193

Những công việc này:

Rect scrollBounds = new Rect();
scrollView.getHitRect(scrollBounds);
if (imageView.getLocalVisibleRect(scrollBounds)) {
    // Any portion of the imageView, even a single pixel, is within the visible window
} else {
    // NONE of the imageView is within the visible window
}

1
Hoạt động hoàn hảo. Để làm cho nó rõ ràng hơn: trả về true nếu chế độ xem hoàn toàn hoặc một phần hiển thị; sai có nghĩa là khung nhìn hoàn toàn không nhìn thấy được.
qwertzguy

1
[+1] Tôi đã sử dụng mã này để nhận GridView/ ListView/ GridViewWithHeaderlàm việc với SwipeRefreshLayout.
Kartik

Ai đó có thể vui lòng giải thích tại sao điều này làm việc? getHitRecttrả về một chỉnh lưu trong tọa độ cha, nhưng getLocalVisibleRecttrả về một chỉnh lưu trong tọa độ cục bộ của cuộn, phải không?
Pin

3
Điều này không che lấp chồng chéo, nếu Chế độ xem trẻ em bị chồng chéo bởi một yếu tố con khác, nó vẫn sẽ trở lại đúng
Pradeep

1
Có, chúng ta cần một thể hiện của Rect. Nhưng nó là cần thiết để getHitRect. Có khác gì không nếu tôi sử dụng Rect (0,0-0,0). Chúng tôi có thể thấy getLocalVisibleRect gọi getGlobalVisibleRect.And Rect được đặt ở đây r.set (0, 0, chiều rộng, chiều cao) ;. @ BillMote
Chefish

56

Nếu bạn muốn phát hiện rằng chế độ xem HOÀN TOÀN hiển thị:

private boolean isViewVisible(View view) {
    Rect scrollBounds = new Rect();
    mScrollView.getDrawingRect(scrollBounds);

    float top = view.getY();
    float bottom = top + view.getHeight();

    if (scrollBounds.top < top && scrollBounds.bottom > bottom) {
        return true;
    } else {
        return false;
    }
}

6
Đây là câu trả lời đúng =) Trong trường hợp của tôi, tôi đã thay đổi if như thế này: scrollBound.top <= top && scrollBound.bottom => bottom
Helton Isac

2
+1 Helton nếu chế độ xem của bạn được đẩy lên trên cùng hoặc dưới cùng cho chế độ xem cuộn của bạn, bạn sẽ cần <= hoặc> = tương ứng
Joe Maher

Bạn đã thực sự thử nghiệm điều này? Nó luôn trả về false trong bố cục đơn giản nhất ScrollView và TextView khi còn nhỏ.
Farid

1
Có gì khác nhau giữa getHitRect () & getDrawingRect ()? Xin hướng dẫn
VVB

2
Mã này chỉ hoạt động nếu chế độ xem được thêm trực tiếp vào thư mục gốc của thùng chứa ScrollView. Kiểm tra câu trả lời của Phan Văn Linh nếu bạn muốn xử lý chế độ xem trẻ em trong chế độ xem trẻ em, v.v.
thijsonline

12

Giải pháp của tôi là sử dụng NestedScrollViewphần tử Scroll:

    final Rect scrollBounds = new Rect();
    scroller.getHitRect(scrollBounds);

    scroller.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

            if (myBtn1 != null) {

                if (myBtn1.getLocalVisibleRect(scrollBounds)) {
                    if (!myBtn1.getLocalVisibleRect(scrollBounds)
                            || scrollBounds.height() < myBtn1.getHeight()) {
                        Log.i(TAG, "BTN APPEAR PARCIALY");
                    } else {
                        Log.i(TAG, "BTN APPEAR FULLY!!!");
                    }
                } else {
                    Log.i(TAG, "No");
                }
            }

        }
    });
}

yêu cầu API 23+
SolidSnake

@SolidSnake, không cần bạn nhập lớp khác, nó hoạt động tốt
Parth Anjaria

10

Để mở rộng một chút về câu trả lời của Bill Mote bằng cách sử dụng getLocalVisibleRect, bạn có thể muốn kiểm tra xem chế độ xem chỉ hiển thị một phần:

Rect scrollBounds = new Rect();
scrollView.getHitRect(scrollBounds);
if (!imageView.getLocalVisibleRect(scrollBounds)
    || scrollBounds.height() < imageView.getHeight()) {
    // imageView is not within or only partially within the visible window
} else {
    // imageView is completely visible
}

6
Điều này không hoạt động .. thậm chí chế độ xem một phần được phân loại là hoàn toàn có thể nhìn thấy
azfar

10

Tiện ích mở rộng này giúp phát hiện chế độ xem hoàn toàn hiển thị.
Nó cũng hoạt động nếu bạn Viewlà con của ... của ScrollView(ví dụ: ScrollView-> LinearLayout-> ContraintLayout-> ... -> YourView).

fun ScrollView.isViewVisible(view: View): Boolean {
    val scrollBounds = Rect()
    this.getDrawingRect(scrollBounds)
    var top = 0f
    var temp = view
    while (temp !is ScrollView){
        top += (temp).y
        temp = temp.parent as View
    }
    val bottom = top + view.height
    return scrollBounds.top < top && scrollBounds.bottom > bottom
}

Ghi chú

1) view.getY()view.getX()trả lại giá trị x, y cho PHỤ HUYNH ĐẦU TIÊN .

2) Đây là ví dụ về cách getDrawingRectsẽ trả về Liên kếtnhập mô tả hình ảnh ở đây


Tôi muốn một giải pháp trong đó phương thức sẽ trả về false nếu chế độ xem bị ẩn dưới bàn phím và điều này thực hiện công việc. Cảm ơn.
Raul

8
public static int getVisiblePercent(View v) {
        if (v.isShown()) {
            Rect r = new Rect();
            v.getGlobalVisibleRect(r);
            double sVisible = r.width() * r.height();
            double sTotal = v.getWidth() * v.getHeight();
            return (int) (100 * sVisible / sTotal);
        } else {
            return -1;
        }
    }

2
Điều này khác với những gì ab11 yêu cầu. isShown () chỉ kiểm tra cờ hiển thị, không xem chế độ xem có nằm trong vùng hiển thị của màn hình hay không.
Romain Guy

4
@Romain Guy Mã không bao phủ khi toàn bộ chế độ xem được cuộn ra khỏi màn hình. Nó phải là 'static static int getVisiblePercent (Xem v) {if (v.isShown ()) {Rect r = new Rect (); boolean isVisible = v.getGlobalVisibleRect (r); if (isVisible) {double sVisible = r. thong () * r.height (); gấp đôi sTotal = v.getWidth () * v.getHeight (); return (int) (100 * sVisible / sTotal); } khác {return -1; }} khác {return -1; }} `
bếp

6

Tôi đã đối mặt với cùng một vấn đề ngày hôm nay. Trong khi Googling và đọc tài liệu tham khảo Android, tôi đã tìm thấy bài đăng này và một phương pháp mà cuối cùng tôi đã sử dụng;

public final boolean getLocalVisibleRect (Rect r)

Rất vui khi họ không chỉ cung cấp Rect mà còn cho biết boolean nếu View hoàn toàn hiển thị. Về mặt tiêu cực, phương pháp này không có giấy tờ :(


1
Điều này chỉ cho bạn biết nếu mục được đặt thành khả năng hiển thị (đúng). Nó không cho bạn biết nếu mục "hiển thị" thực sự hiển thị trong chế độ xem.
Bill Mote

Mã cho getLocalVisibleRect không hỗ trợ cho yêu cầu của bạn: `công khai boolean cuối cùng getLocalVisibleRect (Rect r) {Final Point offset = mAttachInfo! = Null? mAttachInfo.mPoint: Điểm mới (); if (getGlobalVisibleRect (r, offset)) {r.offset (-offset.x, -offset.y); // làm cho r trả về cục bộ đúng; } trả về sai; } `
mbafford

6

Tôi muốn phát hiện xem bạn đã Viewhoàn toàn chưa visible, hãy thử với phương pháp này:

private boolean isViewVisible(View view) {
    Rect scrollBounds = new Rect();
    mScrollView.getDrawingRect(scrollBounds);
    float top = view.getY();
    float bottom = top + view.getHeight();
    if (scrollBounds.top < top && scrollBounds.bottom > bottom) {
        return true; //View is visible.
    } else {
        return false; //View is NOT visible.
    }
}

Nói một cách chính xác, bạn có thể thấy được tầm nhìn với:

if (myView.getVisibility() == View.VISIBLE) {
    //VISIBLE
} else {
    //INVISIBLE
}

Các giá trị không đổi rõ ràng của khả năng hiển thị trong Chế độ xem là:

TẦM NHÌN Quan điểm này có thể nhìn thấy. Sử dụng với setVisibility (int) và android: mức độ hiển thị.

VẤN ĐỀ Chế độ xem này là vô hình, nhưng nó vẫn chiếm không gian cho mục đích bố trí. Sử dụng với setVisibility (int) và android: mức độ hiển thị.

Gone Chế độ xem này là vô hình và nó không chiếm bất kỳ không gian nào cho mục đích bố trí. Sử dụng với setVisibility (int) và android: mức độ hiển thị.


3
vỗ tay chậm. Những gì OP muốn biết là, giả sử khả năng hiển thị của chế độ xem là Chế độ xem # VISIBLE, làm thế nào để biết liệu chế độ xem có hiển thị trong chế độ xem cuộn hay không.
Joao Sousa

1
Tôi chỉ kiểm tra một dự án đơn giản. Bố cục có ScrollView và TextView khi còn nhỏ; luôn trả về false mặc dù TextView hoàn toàn hiển thị.
Farid

Nó trả về luôn luôn sai.
Raul

3

Bạn có thể sử dụng FocusAwareScrollViewthông báo khi chế độ xem hiển thị:

FocusAwareScrollView focusAwareScrollView = (FocusAwareScrollView) findViewById(R.id.focusAwareScrollView);
    if (focusAwareScrollView != null) {

        ArrayList<View> viewList = new ArrayList<>();
        viewList.add(yourView1);
        viewList.add(yourView2);

        focusAwareScrollView.registerViewSeenCallBack(viewList, new FocusAwareScrollView.OnViewSeenListener() {

            @Override
            public void onViewSeen(View v, int percentageScrolled) {

                if (v == yourView1) {

                    // user have seen view1

                } else if (v == yourView2) {

                    // user have seen view2
                }
            }
        });

    }

Đây là lớp học:

import android.content.Context;
import android.graphics.Rect;
import android.support.v4.widget.NestedScrollView;
import android.util.AttributeSet;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class FocusAwareScrollView extends NestedScrollView {

    private List<OnScrollViewListener> onScrollViewListeners = new ArrayList<>();

    public FocusAwareScrollView(Context context) {
        super(context);
    }

    public FocusAwareScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FocusAwareScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public interface OnScrollViewListener {
        void onScrollChanged(FocusAwareScrollView v, int l, int t, int oldl, int oldt);
    }

    public interface OnViewSeenListener {
        void onViewSeen(View v, int percentageScrolled);
    }

    public void addOnScrollListener(OnScrollViewListener l) {
        onScrollViewListeners.add(l);
    }

    public void removeOnScrollListener(OnScrollViewListener l) {
        onScrollViewListeners.remove(l);
    }

    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        for (int i = onScrollViewListeners.size() - 1; i >= 0; i--) {
            onScrollViewListeners.get(i).onScrollChanged(this, l, t, oldl, oldt);
        }
        super.onScrollChanged(l, t, oldl, oldt);
    }

    @Override
    public void requestChildFocus(View child, View focused) {
        super.requestChildFocus(child, focused);
    }

    private boolean handleViewSeenEvent(View view, int scrollBoundsBottom, int scrollYOffset,
                                        float minSeenPercentage, OnViewSeenListener onViewSeenListener) {
        int loc[] = new int[2];
        view.getLocationOnScreen(loc);
        int viewBottomPos = loc[1] - scrollYOffset + (int) (minSeenPercentage / 100 * view.getMeasuredHeight());
        if (viewBottomPos <= scrollBoundsBottom) {
            int scrollViewHeight = this.getChildAt(0).getHeight();
            int viewPosition = this.getScrollY() + view.getScrollY() + view.getHeight();
            int percentageSeen = (int) ((double) viewPosition / scrollViewHeight * 100);
            onViewSeenListener.onViewSeen(view, percentageSeen);
            return true;
        }
        return false;
    }

    public void registerViewSeenCallBack(final ArrayList<View> views, final OnViewSeenListener onViewSeenListener) {

        final boolean[] viewSeen = new boolean[views.size()];

        FocusAwareScrollView.this.postDelayed(new Runnable() {
            @Override
            public void run() {

                final Rect scrollBounds = new Rect();
                FocusAwareScrollView.this.getHitRect(scrollBounds);
                final int loc[] = new int[2];
                FocusAwareScrollView.this.getLocationOnScreen(loc);

                FocusAwareScrollView.this.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {

                    boolean allViewsSeen = true;

                    @Override
                    public void onScrollChange(NestedScrollView v, int x, int y, int oldx, int oldy) {

                        for (int index = 0; index < views.size(); index++) {

                            //Change this to adjust criteria
                            float viewSeenPercent = 1;

                            if (!viewSeen[index])
                                viewSeen[index] = handleViewSeenEvent(views.get(index), scrollBounds.bottom, loc[1], viewSeenPercent, onViewSeenListener);

                            if (!viewSeen[index])
                                allViewsSeen = false;
                        }

                        //Remove this if you want continuous callbacks
                        if (allViewsSeen)
                            FocusAwareScrollView.this.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) null);
                    }
                });
            }
        }, 500);
    }
}

1

Cách Kotlin;

Một tiện ích mở rộng để liệt kê cuộn của chế độ xem cuộn và nhận hành động nếu chế độ xem con hiển thị trên màn hình.

@SuppressLint("ClickableViewAccessibility")
fun View.setChildViewOnScreenListener(view: View, action: () -> Unit) {
    val visibleScreen = Rect()

    this.setOnTouchListener { _, motionEvent ->
        if (motionEvent.action == MotionEvent.ACTION_MOVE) {
            this.getDrawingRect(visibleScreen)

            if (view.getLocalVisibleRect(visibleScreen)) {
                action()
            }
        }

        false
    }
}

Sử dụng chức năng mở rộng này cho mọi chế độ xem có thể cuộn

nestedScrollView.setChildViewOnScreenListener(childView) {
               action()
            }

0

Tôi biết nó rất muộn. Nhưng tôi có một giải pháp tốt. Dưới đây là đoạn mã để có được tỷ lệ phần trăm hiển thị trong chế độ xem cuộn.

Trước hết, thiết lập trình nghe cảm ứng trên chế độ xem cuộn để nhận cuộc gọi lại khi dừng cuộn.

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch ( event.getAction( ) ) {
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    if(mScrollView == null){
                        mScrollView = (ScrollView) findViewById(R.id.mScrollView);
                    }
                    int childCount = scrollViewRootChild.getChildCount();

                    //Scroll view location on screen
                    int[] scrollViewLocation = {0,0};
                    mScrollView.getLocationOnScreen(scrollViewLocation);

                    //Scroll view height
                    int scrollViewHeight = mScrollView.getHeight();
                    for (int i = 0; i < childCount; i++){
                        View child = scrollViewRootChild.getChildAt(i);
                        if(child != null && child.getVisibility() == View.VISIBLE){
                            int[] viewLocation = new int[2];
                            child.getLocationOnScreen(viewLocation);
                            int viewHeight = child.getHeight();
                            getViewVisibilityOnScrollStopped(scrollViewLocation, scrollViewHeight,
                                    viewLocation, viewHeight, (String) child.getTag(), (childCount - (i+1)));
                        }
                    }
                }
            }, 150);
            break;
    }
    return false;
}

Trong đoạn mã trên, chúng tôi sẽ nhận được các cuộc gọi lại cho các sự kiện chạm màn hình cuộn và đăng một lần chạy sau 150 mili (Không bắt buộc) sau khi dừng cuộc gọi lại cho cuộn. Trong đó có thể chạy được, chúng ta sẽ có được vị trí của chế độ xem cuộn trên màn hình và chiều cao của chế độ xem cuộn. Sau đó lấy ví dụ nhóm con trực tiếp của chế độ xem cuộn và lấy số đếm con. Trong trường hợp của tôi, con trực tiếp của chế độ xem cuộn là linearLayout có tên scrollViewRootChild . Sau đó lặp lại tất cả các khung nhìn con của scrollViewRootChild . Trong đoạn mã trên, bạn có thể thấy tôi đang lấy vị trí của đứa trẻ trên màn hình trong một mảng số nguyên có tên viewLocation , lấy chiều cao của chế độ xem trong tên biến viewHeight . Sau đó, tôi đã gọi một phương thức riêng getViewVisibilityOnScrollStopped. Bạn có thể có được sự hiểu biết về hoạt động nội bộ của phương pháp này bằng cách đọc tài liệu.

/**
 * getViewVisibilityOnScrollStopped
 * @param scrollViewLocation location of scroll view on screen
 * @param scrollViewHeight height of scroll view
 * @param viewLocation location of view on screen, you can use the method of view claas's getLocationOnScreen method.
 * @param viewHeight height of view
 * @param tag tag on view
 * @param childPending number of views pending for iteration.
 */
void getViewVisibilityOnScrollStopped(int[] scrollViewLocation, int scrollViewHeight, int[] viewLocation, int viewHeight, String tag, int childPending) {
    float visiblePercent = 0f;
    int viewBottom = viewHeight + viewLocation[1]; //Get the bottom of view.
    if(viewLocation[1] >= scrollViewLocation[1]) {  //if view's top is inside the scroll view.
        visiblePercent = 100;
        int scrollBottom = scrollViewHeight + scrollViewLocation[1];    //Get the bottom of scroll view 
        if (viewBottom >= scrollBottom) {   //If view's bottom is outside from scroll view
            int visiblePart = scrollBottom - viewLocation[1];  //Find the visible part of view by subtracting view's top from scrollview's bottom  
            visiblePercent = (float) visiblePart / viewHeight * 100;
        }
    }else{      //if view's top is outside the scroll view.
        if(viewBottom > scrollViewLocation[1]){ //if view's bottom is outside the scroll view
            int visiblePart = viewBottom - scrollViewLocation[1]; //Find the visible part of view by subtracting scroll view's top from view's bottom
            visiblePercent = (float) visiblePart / viewHeight * 100;
        }
    }
    if(visiblePercent > 0f){
        visibleWidgets.add(tag);        //List of visible view.
    }
    if(childPending == 0){
        //Do after iterating all children.
    }
}

Nếu bạn cảm thấy bất kỳ cải thiện trong mã này xin vui lòng đóng góp.


0

Cuối cùng tôi đã thực hiện kết hợp hai trong số các câu trả lời Java (@ bill-mote https://stackoverflow.com/a/12428154/3686125 và @ denys-vasylenko https://stackoverflow.com/a/25528434/3686125 ) trong dự án của tôi dưới dạng một tập hợp các phần mở rộng Kotlin, hỗ trợ các điều khiển ScrollView dọc hoặc ngang dọc tiêu chuẩn.

Tôi vừa ném những thứ này vào một tệp Kotlin có tên là Extended.kt, không có lớp, chỉ có các phương thức.

Tôi đã sử dụng những mục này để xác định mục nào sẽ được chụp khi người dùng dừng cuộn trong các lần xem khác nhau trong dự án của tôi:

fun View.isPartiallyOrFullyVisible(horizontalScrollView: HorizontalScrollView) : Boolean {
    @Suppress("CanBeVal") var scrollBounds = Rect()
    horizontalScrollView.getHitRect(scrollBounds)
    return getLocalVisibleRect(scrollBounds)
}

fun View.isPartiallyOrFullyVisible(scrollView: ScrollView) : Boolean {
    @Suppress("CanBeVal") var scrollBounds = Rect()
    scrollView.getHitRect(scrollBounds)
    return getLocalVisibleRect(scrollBounds)
}

fun View.isFullyVisible(horizontalScrollView: HorizontalScrollView) : Boolean {
    @Suppress("CanBeVal") var scrollBounds = Rect()
    horizontalScrollView.getDrawingRect(scrollBounds)
    val left = x
    val right = left + width
    return scrollBounds.left < left && scrollBounds.right > right
}

fun View.isFullyVisible(scrollView: ScrollView) : Boolean {
    @Suppress("CanBeVal") var scrollBounds = Rect()
    scrollView.getDrawingRect(scrollBounds)
    val top = y
    val bottom = top + height
    return scrollBounds.top < top && scrollBounds.bottom > bottom
}

fun View.isPartiallyVisible(horizontalScrollView: HorizontalScrollView) : Boolean = isPartiallyOrFullyVisible(horizontalScrollView) && !isFullyVisible(horizontalScrollView)
fun View.isPartiallyVisible(scrollView: ScrollView) : Boolean = isPartiallyOrFullyVisible(scrollView) && !isFullyVisible(scrollView)

Ví dụ về cách sử dụng, lặp đi lặp lại thông qua các con tuyến tính và kết quả ghi nhật ký của scrollview:

val linearLayoutChild: LinearLayout = getChildAt(0) as LinearLayout
val scrollView = findViewById(R.id.scroll_view) //Replace with your scrollview control or synthetic accessor
for (i in 0 until linearLayoutChild.childCount) {
    with (linearLayoutChild.getChildAt(i)) {
        Log.d("ScrollView", "child$i left=$left width=$width isPartiallyOrFullyVisible=${isPartiallyOrFullyVisible(scrollView)} isFullyVisible=${isFullyVisible(scrollView)} isPartiallyVisible=${isPartiallyVisible(scrollView)}")
    }
}

1
Tại sao bạn đang sử dụng varvà ngăn chặn gợi ý ide?
Filipkowicz

-1

Sử dụng câu trả lời @Qberticus, nhưng đó là btw tuyệt vời, tôi đã tổng hợp một loạt các mã để kiểm tra xem bất cứ khi nào một cuộn xem được gọi và được cuộn nó sẽ kích hoạt câu trả lời @Qberticus và bạn có thể làm bất cứ điều gì bạn muốn, trong trường hợp của tôi, tôi có một Mạng xã hội chứa video nên khi màn hình được vẽ trên màn hình, tôi phát video cùng ý tưởng như facebook và Instagram. Đây là mã:

mainscrollview.getViewTreeObserver().addOnScrollChangedListener(new OnScrollChangedListener() {

                    @Override
                    public void onScrollChanged() {
                        //mainscrollview is my scrollview that have inside it a linearlayout containing many child views.
                        Rect bounds = new Rect();
                         for(int xx=1;xx<=postslayoutindex;xx++)
                         {

                          //postslayoutindex is the index of how many posts are read.
                          //postslayoutchild is the main layout for the posts.
                        if(postslayoutchild[xx]!=null){

                            postslayoutchild[xx].getHitRect(bounds);

                        Rect scrollBounds = new Rect();
                        mainscrollview.getDrawingRect(scrollBounds);

                        if(Rect.intersects(scrollBounds, bounds))
                        {
                            vidPreview[xx].startPlaywithoutstoppping();
                         //I made my own custom video player using textureview and initialized it globally in the class as an array so I can access it from anywhere.
                        }
                        else
                        {

                        }


                        }
                    }
                    }
                });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.