Я знаю, что очень поздно.Но у меня есть хорошее решение.Ниже приведен фрагмент кода для получения процента видимости в представлении прокрутки.
Прежде всего установите сенсорный слушатель в представлении прокрутки для получения обратного вызова для остановки прокрутки.
@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 миллис (не обязательно) после прекращения обратного вызова прокрутки.В этом runnable мы получим расположение вида прокрутки на экране и высоту вида прокрутки.Затем получите прямой дочерний экземпляр группы просмотра представления прокрутки и получите количество дочерних элементов.В моем случае прямым потомком представления прокрутки является LinearLayout с именем scrollViewRootChild .Затем выполните итерацию всех дочерних представлений scrollViewRootChild .В приведенном выше фрагменте кода вы можете видеть, как я получаю местоположение дочернего элемента на экране в массиве целых чисел с именем viewLocation , получить высоту представления в имени переменной viewHeight .Затем я вызвал закрытый метод 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.
}
}
Если вы чувствуете какие-либо улучшения в этом коде, пожалуйста, внесите свой вклад.