Android: bagaimana cara memeriksa apakah bagian dalam Tampilan ScrollView terlihat?

168

Saya punya ScrollView yang memegang serangkaian Views. Saya ingin dapat menentukan apakah tampilan saat ini terlihat (jika ada bagian yang saat ini ditampilkan oleh ScrollView). Saya mengharapkan kode di bawah ini untuk melakukan ini, anehnya tidak:

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
}
ab11
sumber
Saya ingin tahu bagaimana Anda membuat ini berfungsi. Saya mencoba melakukan hal yang sama tetapi ScrollView hanya dapat menampung 1 anak langsung. Apakah "serangkaian tampilan" Anda dibungkus dengan tata letak lain di dalam ScrollView? Begitulah cara saya ditata tetapi ketika saya melakukan itu tidak ada jawaban yang diberikan di sini bekerja untuk saya.
Rooster242
1
Ya, serangkaian pandangan saya ada di dalam LinearLayout, yang merupakan 1 anak dari ScrollView. Jawaban Qberticus berhasil untuk saya.
11

Jawaban:

65

Gunakan View#getHitRectalih-alih View#getDrawingRectpada tampilan yang Anda uji. Anda dapat menggunakan View#getDrawingRectdiScrollView alih alih menghitung secara eksplisit.

Kode dari View#getDrawingRect:

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

Kode dari View#getHitRect:

public void getHitRect(Rect outRect) {
        outRect.set(mLeft, mTop, mRight, mBottom);
}
Schuler yang kaya
sumber
35
Di mana saya harus memanggil metode ini?
Tooto
3
@Qberticus Bagaimana cara memanggil metode? Saya menggunakannya dan itu selalu kembali palsu. Tolong beri tahu saya
KK_07k11A0585
2
Di mana tepatnya memanggil metode ini?
zemaitis
193

Ini bekerja:

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
}
Bill Mote
sumber
1
Bekerja dengan sempurna. Untuk membuatnya lebih jelas: mengembalikan true jika tampilan sepenuhnya atau sebagian terlihat; false berarti tampilan sama sekali tidak terlihat.
qwertzguy
1
[+1] Saya menggunakan kode ini untuk mendapatkan GridView/ ListView/ GridViewWithHeaderbekerja dengannya SwipeRefreshLayout.
Kartik
Bisakah seseorang tolong jelaskan mengapa ini bekerja? getHitRectmengembalikan kotak di koordinat induk, tetapi getLocalVisibleRectmengembalikan kotak di koordinat lokal scrollview, bukan?
Pin
3
Ini tidak mencakup tumpang tindih, jika Tampilan Anak tumpang tindih dengan elemen anak lain, itu masih akan kembali benar
Pradeep
1
Ya, kami membutuhkan turunan Rect.Tapi apakah perlu untuk getHitRect. Apakah ada perbedaan jika saya menggunakan Rect (0,0-0,0). Kita dapat melihat getLocalVisibleRect get getGlobalVisibleRect. Dan Rect diatur di sini r.set (0, 0, lebar, tinggi);. @ BillMote
chefish
56

Jika Anda ingin mendeteksi bahwa tampilan SEPENUHNYA terlihat:

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;
    }
}
Denys Vasylenko
sumber
6
Ini adalah jawaban yang benar =) Dalam kasus saya, saya mengubah if seperti ini: scrollBounds.top <= atas && scrollBounds.bottom => bawah
Helton Isac
2
+1 Helton jika tampilan Anda didorong ke atas atau bawah untuk tampilan gulir, Anda akan memerlukan masing
Joe Maher
Sudahkah Anda benar-benar menguji ini? Itu selalu mengembalikan false dalam tata letak ScrollView dan TextView paling sederhana sebagai seorang anak.
Farid
1
Apa perbedaan antara getHitRect () & getDrawingRect ()? Harap
pandu
2
Kode ini hanya berfungsi jika tampilan ditambahkan langsung ke akar wadah ScrollView. Periksa jawaban Phan Van Linh jika Anda ingin menangani tampilan anak dalam tampilan anak dll.
thijsonline
12

Solusi saya adalah menggunakan NestedScrollViewelemen Gulir:

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

        }
    });
}
Server web
sumber
membutuhkan API 23+
SolidSnake
@ SolidSnake, tidak, Anda perlu mengimpor kelas yang berbeda, itu berfungsi dengan baik
Parth Anjaria
10

Untuk sedikit memperluas jawaban Bill Mote menggunakan getLocalVisibleRect, Anda mungkin ingin memeriksa apakah tampilan hanya terlihat sebagian:

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
}
Ketombe
sumber
6
Ini tidak berfungsi .. bahkan sebagian tampilan yang terlihat dikategorikan sebagai sepenuhnya terlihat
azfar
10

Ekstensi ini membantu mendeteksi tampilan yang sepenuhnya terlihat.
Ini juga berfungsi jika Anda Viewadalah anak dari ... ScrollView(misalnya: 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
}

Catatan

1) view.getY()dan view.getX()kembalikan nilai x, y ke PARENT PERTAMA .

2) Berikut adalah contoh tentang bagaimana getDrawingRectmengembalikan Tautanmasukkan deskripsi gambar di sini

Phan Van Linh
sumber
Saya ingin solusi di mana metode harus mengembalikan false jika tampilan disembunyikan di bawah keyboard dan ini berhasil. Terima kasih.
Rahul
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;
        }
    }
yanchenko
sumber
2
Ini berbeda dari apa yang diminta ab11. isShown () hanya memeriksa bendera visibilitas, bukan apakah tampilan berada di wilayah layar yang terlihat.
Romain Guy
4
@ Domain Guy Kode ini tidak mencakup ketika tampilan total digulir layar. Itu harus `public static int getVisiblePercent (Lihat v) {if (v.isShown ()) {Rect r = new Rect (); boolean isVisible = v.getGlobalVisibleRect (r); if (isVisible) {double sVisible = r.width () * r.height (); sTotal ganda = v.getWidth () * v.getHeight (); return (int) (100 * sVisible / sTotal); } else {return -1; }} else {return -1; }} `
chefish
6

Saya menghadapi masalah yang sama hari ini. Saat mencari di Google dan membaca referensi Android, saya menemukan posting ini dan metode yang akhirnya saya gunakan;

public final boolean getLocalVisibleRect (Rect r)

Nice dari mereka tidak hanya menyediakan Rect tetapi juga boolean menunjukkan jika Lihat terlihat sama sekali. Di sisi negatif, metode ini tidak berdokumen :(

harisme
sumber
1
Ini hanya memberi tahu Anda jika item diatur ke visibilitas (benar). Itu tidak memberi tahu Anda jika item "terlihat" benar-benar terlihat di dalam viewport.
Bill Mote
Kode untuk getLocalVisibleRect tidak mendukung klaim Anda: `public final boolean getLocalVisibleRect (Rect r) {final Point offset = mAttachInfo! = Null? mAttachInfo.mPoint: new Point (); if (getGlobalVisibleRect (r, offset)) {r.offset (-offset.x, -offset.y); // jadikan r pengembalian lokal benar; } return false; ``
mbafford
6

Saya ingin Anda mendeteksi apakah Anda Viewsepenuhnya visible, coba dengan metode ini:

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.
    }
}

Sebenarnya Anda bisa mendapatkan visibilitas tampilan dengan:

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

Nilai konstan yang mungkin dari visibilitas dalam Tampilan adalah:

TERLIHAT Tampilan ini terlihat. Gunakan dengan setVisibility (int) dan android: visibility.

INVISIBLE Tampilan ini tidak terlihat, tetapi masih membutuhkan ruang untuk keperluan tata letak. Gunakan dengan setVisibility (int) dan android: visibility.

PERGI Tampilan ini tidak terlihat, dan tidak membutuhkan ruang apa pun untuk keperluan tata letak. Gunakan dengan setVisibility (int) dan android: visibility.

Jorgesys
sumber
3
bertepuk tangan pelan. Yang ingin diketahui OP adalah, dengan asumsi visibilitas tampilan adalah View # VISIBLE, bagaimana cara mengetahui apakah view itu sendiri terlihat di dalam scrollview.
Joao Sousa
1
Saya baru saja memeriksa proyek sederhana. Tata letak memiliki ScrollView dan TextView sebagai seorang anak; selalu mengembalikan false meskipun TextView sepenuhnya terlihat.
Farid
Mengembalikan selalu salah.
Rahul
3

Anda dapat menggunakan FocusAwareScrollViewyang memberi tahu saat tampilan menjadi terlihat:

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

    }

Ini kelasnya:

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);
    }
}
Vaibhav Jani
sumber
1

Jalan Kotlin;

Perpanjangan untuk daftar gulir tampilan gulir dan dapatkan tindakan jika tampilan anak terlihat di layar.

@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
    }
}

Gunakan fungsi ekstensi ini untuk tampilan yang dapat digulir

nestedScrollView.setChildViewOnScreenListener(childView) {
               action()
            }
Kafe Mert Ceyhan
sumber
0

Saya tahu ini sudah sangat terlambat. Tetapi saya punya solusi yang bagus. Di bawah ini adalah cuplikan kode untuk mendapatkan persentase visibilitas tampilan dalam tampilan gulir.

Pertama-tama atur pendengar sentuh pada tampilan gulir untuk mendapatkan panggilan balik untuk gulir berhenti.

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

Dalam cuplikan kode di atas, kami menerima panggilan balik untuk acara sentuh tampilan gulir dan memposting runnable setelah 150 milis (Tidak wajib) setelah panggilan balik untuk gulir dihentikan. Dalam runnable itu kita akan mendapatkan lokasi tampilan gulir di layar dan ketinggian tampilan gulir. Kemudian dapatkan instance viewgroup anak langsung dari tampilan gulir dan dapatkan jumlah anak. Dalam kasus saya anak langsung dari tampilan gulir adalah LinearLayout bernama scrollViewRootChild . Kemudian ulangi semua tampilan anak dari scrollViewRootChild . Dalam cuplikan kode di atas Anda dapat melihat saya mendapatkan lokasi anak di layar dalam array integer bernama viewLocation , dapatkan ketinggian tampilan dalam nama variabel viewHeight . Kemudian saya memanggil metode pribadi getViewVisibilityOnScrollStopped. Anda bisa mendapatkan pemahaman tentang cara kerja internal metode ini dengan membaca dokumentasi.

/**
 * 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.
    }
}

Jika Anda merasa ada peningkatan dalam kode ini, silakan berkontribusi.

Himanshu
sumber
0

Saya akhirnya menerapkan kombinasi dua jawaban Java (@ bill-mote https://stackoverflow.com/a/12428154/3686125 dan @ denys-vasylenko https://stackoverflow.com/a/25528434/3686125 ) di proyek saya sebagai sekumpulan ekstensi Kotlin, yang mendukung kontrol ScrollView vertikal standar atau HorizontalScrollView.

Saya hanya melemparkan ini dalam file Kotlin bernama Extensions.kt, tidak ada kelas, hanya metode.

Saya menggunakan ini untuk menentukan item mana yang akan diambil ketika pengguna berhenti menggulir dalam berbagai tampilan gulir dalam proyek saya:

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)

Contoh penggunaan, mengulangi melalui anak-anak LinearLayout scrollview dan mencatat keluaran:

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)}")
    }
}
ChrisPrime
sumber
1
mengapa Anda menggunakan vardan menekan petunjuk ide?
Filipkowicz
-1

Menggunakan @Qberticus jawaban yang to the point tapi btw hebat, saya menyusun banyak kode untuk memeriksa apakah setiap kali scrollview dipanggil dan digulir itu memicu jawaban @ Qberticus dan Anda dapat melakukan apa pun yang Anda inginkan, dalam kasus saya saya punya jejaring sosial yang berisi video sehingga ketika tampilan digambar di layar saya memutar ide video yang sama seperti facebook dan Instagram. Berikut kodenya:

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
                        {

                        }


                        }
                    }
                    }
                });
Haytham Osama
sumber