Android 如何知道滚动条内的视图是否完全可见

Android 如何知道滚动条内的视图是否完全可见,android,scrollview,android-imageview,android-scrollview,Android,Scrollview,Android Imageview,Android Scrollview,标题(屏幕顶部)和选项卡(屏幕底部)之间有滚动视图。我想知道ScrollView中的ImageView是否在手机屏幕窗口中完全可见 我建议采用以下方法(方法类似于中的方法) 例如,您有以下xml(我不确定标题和选项卡是什么,因此它们被遗漏): 然后,活动可能如下所示: public class MyActivity extends Activity { private static final String TAG = "MyActivity"; private Scro

标题(屏幕顶部)和选项卡(屏幕底部)之间有滚动视图。我想知道ScrollView中的ImageView是否在手机屏幕窗口中完全可见


我建议采用以下方法(方法类似于中的方法)

例如,您有以下xml(我不确定标题和选项卡是什么,因此它们被遗漏):


然后,活动可能如下所示:

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);
    }
}
公共类MyActivity扩展活动{
私有静态最终字符串TAG=“MyActivity”;
私有滚动视图mScroll=null;
private-ImageView-mImage=null;
私有ViewTreeObserver.OnGlobalLayoutListener mLayoutListener=新ViewTreeObserver.OnGlobalLayoutListener(){
@凌驾
公共图书馆{
final Rect-imageRect=new Rect(0,0,mImage.getWidth(),mImage.getHeight());
最终Rect imageVisibleRect=新Rect(imageRect);
mScroll.getChildVisibleRect(mImage,imageVisibleRect,null);
如果(imageVisibleRect.height()
如果图像较小,则会记录:图像完全可见

但是,您应该注意以下不一致性(根据我的理解):如果您有大图像,但对其进行缩放(例如,您将
android:layout\u width=“wrap\u content”
)时,它看起来会缩放,但实际的
ImageView
高度将与图像的全高相同(而且
ScrollView
甚至会滚动),因此可能需要这样做。这种行为的原因是
FrameLayout

尝试以下操作:
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);
    }
}