设计Android布局,getLeft()(相对)和View.getLocationOnScreen()(绝对)时的实际考虑因素?

时间:2016-10-05 15:49:41

标签: android android-layout listview android-scrollview

我们假设我有一个基本布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layout_container">

    <com.example.ScrollingView 
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/scrolling_view"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical" />

    <FrameLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center">

        <ProgressBar
            android:id="@+id/progress_bar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:indeterminate="true"
            android:layout_margin="1dp"
            android:visibility="gone"/>

    </FrameLayout>

</FrameLayout>

在我的scrollManager中,当你到达可滚动区域的边缘时,我会显示一个EdgeEffect。 EdgeEffect的左右边缘计算如下:

View scrollView = findViewById(R.id.scrolling_view);
int containerWidth = scrollView.getContainerWidth();
int leftEdge = scrollView.getLeft(); // this is relative to parent, so returns 0!
int rightEdge = leftEdge + containerWidth;
// EdgeEffects are correctly drawn after this

layout_container在ListView中绘制。如果它是视图中唯一的项目,则所有这些代码都能正常工作,因为getLeft()会返回相对于父视图的leftX,它是0,恰好对应于屏幕的左侧。

但是,假设我在scrollp_view的左侧添加另一个100px宽的视图。突然间,所有这些代码都变成了垃圾:

View scrollView = findViewById(R.id.scrolling_view);
int containerWidth = scrollView.getContainerWidth(); // 500px
int leftEdge = scrollView.getLeft(); // this is relative to parent, so returns 0.  however, its absolute position is now 100.
int rightEdge = leftEdge + containerWidth; // this now stops 100px short of the right edge of the screen
// EdgeEffects drawn after this all shifted 100px to the left

所以我提出的解决方案是将scrollView.getLeft()(相对于父视图)更改为view.getLocationOnScreen()(这是绝对的)。

View scrollView = findViewById(R.id.scrolling_view);
int containerWidth = scrollView.getContainerWidth();
int[] posXY = new int[2];
scrollView.getPositionOnSreen(posXY);
int leftEdge = posXY[0];
int rightEdge = leftEdge + containerWidth;

我很快就对它进行了测试,它在横向和纵向模式下都能在手机和平​​板电脑上完美运行。

我的问题:

  1. 我使用绝对XY代替而使代码更脆弱 相对XY?
  2. 获取scrollView的父级和 然后在父母上调用getLeft()?
  3. 使用getLeft()和getLocationOnScreen()时还有其他事项要考虑吗?
  4. 谢谢!

0 个答案:

没有答案