7

Существует прокрутка между заголовком (вверху экрана) и вкладками (снизу экрана). Я хочу знать, полностью ли виден ImageView, который находится внутри ScrollView, или нет в окне экрана телефона.Как узнать, доступен ли просмотр внутри прокрутки полностью или нет

enter image description here

+0

Попробуйте следующее: http://stackoverflow.com/a/25528434/3148266 – akshay7692

ответ

3

Я хотел бы предложить, чтобы сделать следующим образом (подход похож на один в this question).

E.g. У вас есть следующий XML (я не уверен, что есть заголовок и вкладки, чтобы они пропустили):

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:id="@+id/scroller"> 
     <ImageView 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:layout_gravity="center" 
      android:id="@+id/image" 
      android:src="@drawable/image001" 
      android:scaleType="fitXY" /> 
</ScrollView> 

Тогда активность может выглядеть следующим образом:

public class MyActivity extends Activity { 

    private static final String TAG = "MyActivity"; 

    private ScrollView mScroll = null; 
    private ImageView mImage = null; 

    private ViewTreeObserver.OnGlobalLayoutListener mLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      final Rect imageRect = new Rect(0, 0, mImage.getWidth(), mImage.getHeight()); 
      final Rect imageVisibleRect = new Rect(imageRect); 

      mScroll.getChildVisibleRect(mImage, imageVisibleRect, null); 

      if (imageVisibleRect.height() < imageRect.height() || 
        imageVisibleRect.width() < imageRect.width()) { 
       Log.w(TAG, "image is not fully visible"); 
      } else { 
       Log.w(TAG, "image is fully visible"); 
      } 

      mScroll.getViewTreeObserver().removeOnGlobalLayoutListener(mLayoutListener); 
     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Show the layout with the test view 
     setContentView(R.layout.main); 

     mScroll = (ScrollView) findViewById(R.id.scroller); 
     mImage = (ImageView) findViewById(R.id.image); 

     mScroll.getViewTreeObserver().addOnGlobalLayoutListener(mLayoutListener); 
    } 
} 

В случае небольшого изображения он будет записываться: изображение полностью видно.

Однако, Вы должны быть осведомлены о следующем несоответствии (согласно моему пониманию): если у Вас есть большое изображение, но делает масштабирование к нему (например, вы установили android:layout_width="wrap_content"), когда он будет выглядеть масштабируется, но фактическая ImageView высота будет так как полная высота изображения (и ScrollView будет даже прокруткой), поэтому может понадобиться adjustViewBounds. Причиной этого является то, что FrameLayoutdoesn't care about layout_width and layout_height of childs.

Смежные вопросы