在android中跟踪相对于LinearLayout的滚动tableRows

Posted

技术标签:

【中文标题】在android中跟踪相对于LinearLayout的滚动tableRows【英文标题】:Tracking scrolling tableRows with respect to a LinearLayout in android 【发布时间】:2013-08-03 00:12:40 【问题描述】:

在相对布局内;我在 ScrollView 中有一个 TableLayout 和一个水平 LinearLayout。我的视图工作正常:随着表格在后台滚动,LinearLayout 在前台是静态的。我现在需要的是在滚动过程中准确地知道表格和 LinearLayout 在哪里相​​交。

由于 LinearLayout 是静态的,我随时都知道它在哪里,比如 y=50pixel。假设我在 TableLayout 中有 TextView。因此,当表格滚动时,我想知道哪个 TextView(即 tableRow)与 LinearLayout 相交/隐藏。

【问题讨论】:

一些背景见***.com/questions/17950082/… 如果我得到的只是一个 TableRow 是高于还是低于该线,这也是一个很好的答案。 你能发布你的布局文件吗?如果可能的话,在你膨胀/初始化这个视图的地方添加代码。 【参考方案1】:

您是否尝试过在表格行上使用View.getLocationOnScreen()

【讨论】:

是的。而且我也已经在这里***.com/questions/3619693/… 尝试过一切。我使用 for 循环为每个 TableRow 执行 .getChildAt(i)。他们都返回 130 作为他们的 yOffset【参考方案2】:

我在 y 偏移 = 310 像素处有一条水平线。当我滚动我的 tableLayout,在一个ScrollView里面,我想知道哪一行 表格与我的水平线相交。

您可以使用View.getLocationInWindow() 方法。最初,您需要查看哪一行与该线相交,然后使用自定义 ScrollView,跟随滚动:

// in the onCreate:
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener() 

                @Override
                public void onGlobalLayout() 
                    int[] loc = new int[2];
                    ll.getLocationInWindow(loc);
                    scrollView.setYIntersection(loc[1]);
                    ViewGroup table = (ViewGroup) scrollView.getChildAt(0);
                    // find out which row initially intersects our line so
                    // we can initialize mCrossedRow and position
                    for (int i = 0; i < table.getChildCount(); i++) 
                        final View row = table.getChildAt(i);
                        row.getLocationInWindow(loc);
                        if (loc[1] <= scrollView.getYIntersection()
                                && loc[1] + row.getHeight() >= scrollView
                                        .getYIntersection()) 
                            scrollView.setCurrIntersection(row, i);
                            row.setBackgroundColor(Color.RED);
                            break;
                        
                    
                    scrollView.getViewTreeObserver()
                            .removeOnGlobalLayoutListener(this);
                
            );

自定义 ScrollView 是:

public class CustomScrollView extends ScrollView 

    /**
     * This will be the current intersected row.
     */
    private View mCrossedRow;
    /**
     * The row position of the intersected row, mCrossedRow.
     */
    private int mRowOrder;
    /**
     * The y value of the intersecting line.
     */
    private int mLine;
    /**
     * Used as a temporary holder for the location retrieval.
     */
    private int[] mLocHelper = new int[2];

    public CustomScrollView(Context context) 
        super(context);
    

    public void setYIntersection(int y) 
        mLine = y;
    

    public int getYIntersection() 
        return mLine;
    

    public void setCurrIntersection(View row, int childPosition) 
        mCrossedRow = row;
        mRowOrder = childPosition;
    

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) 
        super.onScrollChanged(l, t, oldl, oldt);
        // this will be called every time the user scrolls so we need to
        // keep updating the position and see if the crossed row still
        // intersects the line otherwise move it to the next row.
        mCrossedRow.getLocationInWindow(mLocHelper);
        if (mLocHelper[1] <= mLine
                && mLocHelper[1] + mCrossedRow.getHeight() >= mLine) 
            // do nothing, we're still in the same row
         else 
            if (t - oldt > 0) 
                // going down so increase the row position
                mRowOrder++;
             else 
                // going up so decrease the row position
                mRowOrder--;
            
            // visual effect, the intersecting row will have a red
            // background and all other rows will have a white background.
            // You could setup a listener here to get notified that a new
            // row intersects the line.
            mCrossedRow.setBackgroundColor(Color.WHITE);
            mCrossedRow = ((ViewGroup) getChildAt(0)).getChildAt(mRowOrder);
            mCrossedRow.setBackgroundColor(Color.RED);
        
    

【讨论】:

以上是关于在android中跟踪相对于LinearLayout的滚动tableRows的主要内容,如果未能解决你的问题,请参考以下文章

Android利用Fiddler进行网络数据抓包怎么跟踪微信请求

如何在屏幕底部对齐视图,但也在相对布局中的其他视图下方对齐

如何知道单击项目在列表视图中相对于android中的屏幕的y位置

Android之相对布局

在android中查找设备的相对方向

android 中遇到的空指针异常