Zwischen der Kopfzeile (oben auf dem Bildschirm) und den Tabs (unten auf dem Bildschirm) befindet sich eine Bildlaufansicht. Ich möchte wissen, ob das ImageView, das sich in der ScrollView befindet, vollständig sichtbar ist oder nicht auf dem Bildschirm des Telefons angezeigt wird.So erkennen Sie, ob die Ansicht innerhalb des Scrolls vollständig oder nicht sichtbar ist
Antwort
Ich würde vorschlagen, die folgende Art und Weise zu tun (die Annäherung an einen in this question ähnlich ist).
z. Sie haben die folgende xml (Ich bin nicht sicher, was Header sind und Tabs, so dass sie übersehen werden):
<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>
Dann Aktivität wie das aussehen könnte folgende:
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);
}
}
Bei kleinen Bild, um es wird protokollieren: Bild ist vollständig sichtbar.
Allerdings sollten Sie über folgende Unstimmigkeit darüber im Klaren sein (wie in meinem Verständnis): Wenn Sie große Bild haben, aber es Skalierung zu tun (zB Sie setzen android:layout_width="wrap_content"
), wenn es skaliert wird aussehen, aber tatsächlich ImageView
Höhe sein als volle Höhe des Bildes (und ScrollView
wird sogar Scrollen), so könnte adjustViewBounds benötigt werden. Der Grund für dieses Verhalten ist, dass FrameLayout
doesn't care about layout_width and layout_height of childs.
Versuchen Sie Folgendes: http://StackOverflow.com/a/25528434/3148266 – akshay7692