दिलचस्प पोस्ट
क्या एक जावा सरणी को हैशमैप कुंजी के रूप में इस्तेमाल किया जा सकता है क्या "कुछ 0 >>" मतलब है? उत्पाद एसडीके बनाना: मैं एक देशी लिब (.so) और एसडीके के साथ एक जार कैसे जोड़ूं जो मैं बना रहा हूं? पीलाब के साथ एक आंकड़ा कैसे बचा सकता है? सॉर्ट () और रिवर्स () फ़ंक्शंस काम नहीं करते हैं कमांड लाइन से "बिल्ड और आर्काइव" Xcode क्यूटी में ओपनसीवी वीडियो को कुशलतापूर्वक कैसे प्रदर्शित किया जाए? कैसे JTextField में वर्णों की संख्या को सीमित करने के लिए? getch पदावनत है क्यों enums को एक पूर्ण प्रकार का इंट प्रकार की आवश्यकता होती है? पोल पर पिनिंग किए बिना किसी क्षेत्र में एक सिलेंडर बदलना एक NullPointerException क्या है, और मैं इसे कैसे ठीक करूँ? लापता पैकेजों की जांच करने और उन्हें स्थापित करने का शानदार तरीका? आईफोन ओरिएंटेशन को पोर्ट्रेट से लैंडस्केप तक बदलते समय एचटीएमएल फ़ॉन्ट-आकार बनाए रखें PHP PDO बनाम सामान्य mysql_connect

एंड्रॉइड: कैसे ScrollView के अंदर एक दृश्य दिखाई दे रहा है?

मेरे पास एक ScrollView जो Views की एक श्रृंखला रखता है। मैं यह निर्धारित करने में सक्षम होना चाहूंगा कि कोई दृश्य वर्तमान में दृश्यमान है (यदि वर्तमान में ScrollView द्वारा प्रदर्शित किया गया कोई भाग) मुझे यह करने के लिए नीचे कोड की उम्मीद है, आश्चर्य की बात यह नहीं है:

 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 } 

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड: कैसे ScrollView के अंदर एक दृश्य दिखाई दे रहा है?"

View#getHitRect बजाय View#getHitRect उपयोग करें, जिस दृश्य पर आप परीक्षण कर रहे हैं स्पष्ट रूप से गणना के बजाय आप ScrollView पर View#getDrawingRect उपयोग कर सकते हैं

View#getDrawingRect कोड View#getDrawingRect से कोड:

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

View#getHitRect कोड से View#getHitRect :

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

यह काम:

 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 } 

यदि आप जानना चाहते हैं कि दृश्य पूरी तरह से दृश्यमान है:

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

GetLocalVisibleRect का उपयोग करते हुए बिल मोटे के उत्तर पर थोड़ा विस्तार करने के लिए, आप यह देखना चाह सकते हैं कि दृश्य केवल आंशिक रूप से दिखाई दे रहा है या नहीं:

 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 } 

आज मुझे उसी समस्या का सामना करना पड़ा। जबकि Googling और एंड्रॉइड संदर्भ पढ़ना मैं इस पोस्ट पाया और एक विधि मैं बजाय का उपयोग कर समाप्त;

 public final boolean getLocalVisibleRect (Rect r) 

उनमें से अच्छा, केवल रीक्ट प्रदान करने के लिए नहीं बल्कि बूलियन भी इंगित करता है कि यदि सभी को दृश्यमान दिखाई दे। नकारात्मक पक्ष पर यह विधि undocumented है 🙁

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

मेरा समाधान NestedScrollView स्क्रॉल NestedScrollView स्क्रॉल तत्व का उपयोग किया NestedScrollView है:

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

मैं जानना चाहता हूं कि आपका View पूरी तरह से visible , इस विधि से प्रयास करें:

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

कड़ाई से बोलते हुए आप इन दृश्यों की दृश्यता प्राप्त कर सकते हैं:

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

एक दृश्य में दृश्यता के सकारात्मक स्थिर मूल्य हैं:

विजुअल यह दृश्य दृश्यमान है। SetVisibility (int) और एंड्रॉइड के साथ प्रयोग करें: दृश्यता

अविश्वसनीय यह दृश्य अदृश्य है, लेकिन लेआउट के प्रयोजनों के लिए यह अभी भी स्थान ले लेता है। SetVisibility (int) और एंड्रॉइड के साथ प्रयोग करें: दृश्यता

गया गया यह दृश्य अदृश्य है, और लेआउट के प्रयोजनों के लिए यह कोई स्थान नहीं लेता है। SetVisibility (int) और एंड्रॉइड के साथ प्रयोग करें: दृश्यता

आप FocusAwareScrollView उपयोग कर सकते हैं जो दृश्य दिखाई देने पर सूचित करता है:

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

यहां वर्ग है:

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

मैं बहुत देर से जानता हूं लेकिन मेरे पास एक अच्छा समाधान है नीचे स्क्रोल व्यू में दृश्यता प्रतिशत देखने के लिए कोड स्निपेट है

स्क्रॉल स्टॉप के लिए कॉलबैक प्राप्त करने के लिए सबसे पहले स्क्रॉल व्यूवर पर सेट किए गए स्पर्श श्रोता।

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

ऊपर कोड स्निपेट में, हम स्क्रॉल व्यू टच ईवेंट के लिए कॉल बैक प्राप्त कर रहे हैं और स्क्रॉल के लिए कॉलबैक प्राप्त करने के बाद 150 मिलियन (अनिवार्य नहीं) के बाद एक रननबल पोस्ट करें। उस रननेबल में हम स्क्रीन पर स्क्रॉल व्यू के स्थान और स्क्रॉल व्यू ऊँचाई प्राप्त करेंगे। फिर सीधे देखने के लिए प्रत्यक्ष बाल दृश्य समूह उदाहरण प्राप्त करें और बच्चे की गणना करें। मेरे मामले में स्क्रॉल व्यू के प्रत्यक्ष बाल रेखीय लयआउट नामक स्क्रॉलव्यूयूआरयूटीयूटी फिर scrollViewRootChild के सभी बच्चे दृश्यों को पुनरावृति करें उपरोक्त कोड स्निपेट में आप देख सकते हैं कि मैं स्क्रीन पर बच्चे के स्थान को एक पूर्णांक सरणी नामक दृश्य स्थान में प्राप्त कर रहा हूं , चर नाम दृश्य में देखने की ऊंचाई प्राप्त करें। फिर मैंने एक निजी विधि को getViewVisibilityOnScrollStopped कहा। आप दस्तावेज़ीकरण को पढ़ने के द्वारा इस पद्धति के आंतरिक काम की समझ प्राप्त कर सकते हैं।

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

यदि आप इस कोड में कोई सुधार महसूस करते हैं तो कृपया योगदान करें।

क्बर्टिकस के जवाब का उपयोग करना, जो कि बिंदु पर था लेकिन महान बीटीडब्ल्यू, मैंने यह जांचने के लिए कोड के एक गुच्छा की गणना की है कि जब कभी भी स्क्रॉलएव्यू कहलाता है और स्क्रॉल किया जाता है तो इसे @ क्व्वर्टिकस के उत्तर को ट्रिगर किया जाता है और आप जो चाहें कर सकते हैं, मेरे मामले में मेरे पास सामाजिक नेटवर्क वाले वीडियो इसलिए होते हैं जब दृश्य को स्क्रीन पर खींचा जाता है, मैं वीडियो को वही विचार देता हूं जैसे कि फेसबुक और इंस्टाग्राम। यहां कोड है:

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