Android: Wie überprüfe ich, ob eine Ansicht in ScrollView sichtbar ist?


168

Ich habe eine ScrollView, die eine Reihe von hält Views. Ich möchte feststellen können, ob eine Ansicht derzeit sichtbar ist (wenn ein Teil davon derzeit von der angezeigt wird ScrollView). Ich würde erwarten, dass der folgende Code dies tut, überraschenderweise nicht:

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
}

Ich bin gespannt, wie du das zum Laufen gebracht hast. Ich versuche das Gleiche zu tun, aber eine ScrollView kann nur 1 direktes Kind hosten. Sind Ihre "Serien von Ansichten" in ein anderes Layout in der ScrollView eingebunden? So sind meine aufgebaut, aber wenn ich das tue, funktioniert keine der hier gegebenen Antworten für mich.
Rooster242

1
Ja, meine Ansichtsserie befindet sich in einem LinearLayout, dem ersten untergeordneten Element der ScrollView. Qberticus 'Antwort hat bei mir funktioniert.
ab11

Antworten:


65

Verwenden Sie View#getHitRectanstelle View#getDrawingRectder Ansicht, die Sie testen. Sie können View#getDrawingRectauf die ScrollViewanstatt explizit berechnen.

Code von View#getDrawingRect:

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

Code von View#getHitRect:

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

35
Wo soll ich diese Methoden nennen?
Tooto

3
@Qberticus Wie rufe ich die Methoden auf? Ich benutze es und es gibt immer falsch zurück. Bitte lassen Sie es mich wissen
KK_07k11A0585

2
Wo genau sollen diese Methoden aufgerufen werden?
Zemaitis

193

Das funktioniert:

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
Funktioniert perfekt. Um es klarer zu machen: Gibt true zurück, wenn die Ansicht ganz oder teilweise sichtbar ist. false bedeutet, dass die Ansicht vollständig nicht sichtbar ist.
qwertzguy

1
[1] habe ich diesen Code zu erhalten GridView/ ListView/ GridViewWithHeaderArbeit mit SwipeRefreshLayout.
Kartik

Könnte jemand bitte erklären, warum das funktioniert? Gibt ein Rechteck getHitRectin den übergeordneten Koordinaten zurück, aber getLocalVisibleRectein Rechteck in den lokalen Koordinaten der Bildlaufansicht, nicht wahr?
Pin

3
Dies gilt nicht für Überlappungen. Wenn die untergeordnete Ansicht von einem anderen untergeordneten Element überlappt wird, wird weiterhin true zurückgegeben
Pradeep,

1
Ja, wir brauchen eine Instanz von Rect. Aber es ist notwendig, GetRect zu bekommen. Gibt es einen Unterschied, wenn ich ein Rect (0,0-0,0) verwende? Wir können den getLocalVisibleRect-Aufruf getGlobalVisibleRect sehen. Und Rect wird hier festgelegt. R.set (0, 0, width, height) ;. @ BillMote
chefish

56

Wenn Sie feststellen möchten, dass die Ansicht VOLLSTÄNDIG sichtbar ist:

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
Dies ist die richtige Antwort =) In meinem Fall habe ich das if wie folgt geändert: scrollBounds.top <= top && scrollBounds.bottom => bottom
Helton Isac

2
+1 Helton Wenn Ihre Ansicht entweder gegen die Ober- oder Unterseite Ihrer Bildlaufansicht gedrückt wird, benötigen Sie das <= oder> =
Joe Maher

Hast du das wirklich getestet? Im einfachsten Layout ScrollView und TextView als Kind wird immer false zurückgegeben.
Farid

1
Was ist der Unterschied zwischen getHitRect () und getDrawingRect ()? Bitte führen
VVB

2
Dieser Code funktioniert nur, wenn die Ansicht direkt zum Stammverzeichnis des ScrollView-Containers hinzugefügt wird. Überprüfen Sie die Antwort von Phan Van Linh, wenn Sie eine
untergeordnete

12

Meine Lösung ist das NestedScrollViewScroll-Element:

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

        }
    });
}

erfordert API 23+
Solid Snake

@ SolidSnake, nein, Sie müssen eine andere Klasse importieren, es funktioniert gut
Parth Anjaria

10

Um die Antwort von Bill Mote mit getLocalVisibleRect ein wenig zu erweitern, möchten Sie möglicherweise überprüfen, ob die Ansicht nur teilweise sichtbar ist:

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
Dies funktioniert nicht. Selbst eine teilweise sichtbare Ansicht wird als vollständig sichtbar eingestuft
Azfar

10

Diese Erweiterung hilft dabei, die Ansicht vollständig sichtbar zu erkennen.
Es funktioniert auch, wenn Sie Viewein Kind von Kind von ... von sind ScrollView(zB: 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
}

Hinweis

1) view.getY()und view.getX()geben Sie den x, y-Wert an FIRST PARENT zurück .

2) Hier ist beispielsweise darüber , wie getDrawingRectkehrt VerbindungGeben Sie hier die Bildbeschreibung ein


Ich wollte eine Lösung, bei der die Methode false zurückgeben sollte, wenn die Ansicht unter der Tastatur ausgeblendet ist und dies den Job erledigt. Vielen Dank.
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;
        }
    }

2
Dies unterscheidet sich von dem, wonach ab11 gefragt hat. isShown () prüft nur das Sichtbarkeitsflag, nicht, ob sich die Ansicht im sichtbaren Bereich des Bildschirms befindet.
Romain Guy

4
@Romain Guy Der Code deckt nicht ab, wenn eine Ansicht vollständig vom Bildschirm gescrollt wurde. Es sollte "public static int getVisiblePercent (View v) {if (v.isShown ()) {Rect r = new Rect (); boolean isVisible = v.getGlobalVisibleRect (r); if (isVisible) {double sVisible = r.width () * r.height (); double sTotal = v.getWidth () * v.getHeight (); return (int) (100 * sVisible / sTotal); } else {return -1; }} else {return -1; }} `
Chefish

6

Ich hatte heute das gleiche Problem. Beim Googeln und Lesen der Android-Referenz habe ich diesen Beitrag und eine Methode gefunden, die ich stattdessen verwendet habe.

public final boolean getLocalVisibleRect (Rect r)

Schön, dass sie nicht nur Rect, sondern auch Boolesche Werte bereitstellen, um anzuzeigen, ob View überhaupt sichtbar ist. Auf der negativen Seite ist diese Methode nicht dokumentiert :(


1
Hier erfahren Sie nur, ob das Element auf Sichtbarkeit (true) eingestellt ist. Es sagt Ihnen nicht, ob das "sichtbare" Element tatsächlich im Ansichtsfenster sichtbar ist.
Bill Mote

Der Code für getLocalVisibleRect unterstützt Ihre Behauptung nicht: `public final boolean getLocalVisibleRect (Rect r) {final Point offset = mAttachInfo! = Null? mAttachInfo.mPoint: neuer Punkt (); if (getGlobalVisibleRect (r, offset)) {r.offset (-offset.x, -offset.y); // mache r local return true; } falsch zurückgeben; } `
mbafford

6

Wenn Sie feststellen möchten, ob Ihr ViewSystem vollständig ist visible, versuchen Sie es mit folgender Methode:

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

Genau genommen können Sie die Sichtbarkeit einer Ansicht erhalten mit:

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

Die möglichen konstanten Werte der Sichtbarkeit in einer Ansicht sind:

SICHTBAR Diese Ansicht ist sichtbar. Verwendung mit setVisibility (int) und android: sichtbarkeit.

UNSICHTBAR Diese Ansicht ist unsichtbar, nimmt jedoch Platz für Layoutzwecke ein . Verwendung mit setVisibility (int) und android: sichtbarkeit.

GONE Diese Ansicht ist unsichtbar und benötigt keinen Platz für Layoutzwecke . Verwendung mit setVisibility (int) und android: sichtbarkeit.


3
langsam klatschen. Was das OP wissen wollte, ist, unter der Annahme, dass die Sichtbarkeit der Ansicht Ansicht # SICHTBAR ist, zu wissen, ob die Ansicht selbst in einer Bildlaufansicht sichtbar ist.
Joao Sousa

1
Ich habe gerade ein einfaches Projekt überprüft. Das Layout verfügt als untergeordnetes Element über ScrollView und TextView. Gibt immer false zurück, obwohl die Textansicht vollständig sichtbar ist.
Farid

Es wird immer false zurückgegeben.
Rahul

3

Sie können das verwenden, FocusAwareScrollViewdas benachrichtigt, wenn die Ansicht sichtbar wird:

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

    }

Hier ist Klasse:

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

Kotlin Weg;

Eine Erweiterung zum Auflisten des Bildlaufs der Bildlaufansicht und zum Abrufen einer Aktion, wenn die untergeordnete Ansicht auf dem Bildschirm angezeigt wird.

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

Verwenden Sie diese Erweiterungsfunktion für jede scrollbare Ansicht

nestedScrollView.setChildViewOnScreenListener(childView) {
               action()
            }

0

Ich weiß, dass es sehr spät ist. Aber ich habe eine gute Lösung. Unten finden Sie das Code-Snippet zum Abrufen des Prozentsatzes der Sichtbarkeit der Ansicht in der Bildlaufansicht.

Stellen Sie zunächst den Touch Listener in der Bildlaufansicht ein, um einen Rückruf für den Bildlaufstopp zu erhalten.

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

Im obigen Code-Snippet erhalten wir Rückrufe für Touch-Ereignisse in der Bildlaufansicht und veröffentlichen eine ausführbare Datei nach 150 Millis (nicht obligatorisch), nachdem der Rückruf für den Bildlauf gestoppt wurde. In dieser ausführbaren Datei erhalten wir die Position der Bildlaufansicht auf dem Bildschirm und die Höhe der Bildlaufansicht. Rufen Sie dann die direkte Instanz der untergeordneten Ansichtsgruppe der Bildlaufansicht ab und ermitteln Sie die Anzahl der untergeordneten Elemente. In meinem Fall ist das direkte untergeordnete Element der Bildlaufansicht LinearLayout mit dem Namen scrollViewRootChild . Wiederholen Sie dann alle untergeordneten Ansichten von scrollViewRootChild . Im obigen Codeausschnitt sehen Sie, dass ich die Position des untergeordneten Elements auf dem Bildschirm in einem ganzzahligen Array mit dem Namen viewLocation erhalte . Die Ansichtshöhe wird im Variablennamen viewHeight angezeigt . Dann habe ich eine private Methode getViewVisibilityOnScrollStopped aufgerufen. Sie können die interne Funktionsweise dieser Methode anhand der Dokumentation verstehen.

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

Wenn Sie eine Verbesserung dieses Codes bemerken, tragen Sie bitte dazu bei.


0

Am Ende implementierte ich eine Kombination aus zwei der Java-Antworten (@ bill-mote https://stackoverflow.com/a/12428154/3686125 und @ denys-vasylenko https://stackoverflow.com/a/25528434/3686125 ) in Mein Projekt als eine Reihe von Kotlin-Erweiterungen, die entweder standardmäßige vertikale ScrollView- oder HorizontalScrollView-Steuerelemente unterstützen.

Ich habe diese nur in eine Kotlin-Datei namens Extensions.kt geworfen, keine Klasse, nur Methoden.

Ich habe diese verwendet, um zu bestimmen, an welchem ​​Element gefangen werden soll, wenn ein Benutzer in verschiedenen Bildansichten in meinem Projekt nicht mehr blättert:

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)

Beispiel für die Verwendung, durchlaufen der LinearLayout-Kinder von scrollview und Protokollieren von Ausgaben:

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
warum benutzt varund unterdrückst du ide hinweis?
Filipkowicz

-1

Mit der @ Qberticus-Antwort, die auf den Punkt gebracht wurde, aber übrigens großartig war, habe ich eine Reihe von Codes zusammengestellt, um zu überprüfen, ob bei jedem Aufruf einer Bildlaufansicht und beim Scrollen die @ Qberticus-Antwort ausgelöst wird und Sie tun können, was Sie wollen, in meinem Fall habe ich eine soziales Netzwerk mit Videos Wenn ich also die Ansicht auf dem Bildschirm zeichne, spiele ich die gleiche Idee wie Facebook und Instagram. Hier ist der Code:

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
                        {

                        }


                        }
                    }
                    }
                });
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.