cimangxia4989 2018-05-10 05:13
浏览 1194
已结题

Android TV开发,ScrollView嵌套RecyclerView滑动问题

我用的是FocusLayout来让有焦点的控件有个边框,
结果当RecyclerView由下滑动到第一行条目的时候,因为ScrollView还没有到最上面的顶点,
所以还能再往上滑动一次,这个时候FocusLayout还是会绘制一个边框,然后那里没有控件.
请教大佬帮忙解决下.
FocusLayout的代码如下,这个是用来绘制边框的.

```public class FocusLayout extends RelativeLayout implements ViewTreeObserver.OnGlobalFocusChangeListener {
private LayoutParams mFocusLayoutParams;
private View mFocusView;

public FocusLayout(Context context) {
    super(context);
    init(context);
}

public FocusLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public FocusLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

private void init(Context context) {
    this.mFocusLayoutParams = new LayoutParams(0, 0);
    this.mFocusView = new View(context);

    this.mFocusView.setBackgroundResource(R.drawable.default_focus);

// this.mFocusView.setBackgroundResource(R.drawable.focus);
// this.mFocusView.setBackgroundColor(getResources().getColor(R.color.test));
this.addView(this.mFocusView, this.mFocusLayoutParams);
}

public void show(){
    mFocusView.setVisibility(View.VISIBLE);
}


public void unShow(){
    mFocusView.setVisibility(View.INVISIBLE);

}


@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {

    Rect viewRect = new Rect();
    if (newFocus==null)return;
    newFocus.getGlobalVisibleRect(viewRect);
    correctLocation(viewRect);



    this.setFocusLocation(
            viewRect.left - this.mFocusView.getPaddingLeft(),
            viewRect.top - this.mFocusView.getPaddingTop(),
            viewRect.right + this.mFocusView.getPaddingRight(),
            viewRect.bottom + this.mFocusView.getPaddingBottom());


}

/**
 * 由于getGlobalVisibleRect获取的位置是相对于全屏的,所以需要减去FocusLayout本身的左与上距离,变成相对于FocusLayout的
 * @param rect
 */
private void correctLocation(Rect rect) {
    Rect layoutRect = new Rect();
    this.getGlobalVisibleRect(layoutRect);
    rect.left -= layoutRect.left;
    rect.right -= layoutRect.left;
    rect.top -= layoutRect.top;
    rect.bottom -= layoutRect.top;
}

/**
 * 设置焦点view的位置,计算焦点框的大小
 *
 * @param left
 * @param top
 * @param right
 * @param bottom
 */
protected void setFocusLocation(int left, int top, int right, int bottom) {
    int width = right - left;
    int height = bottom - top;

    this.mFocusLayoutParams.width = width;
    this.mFocusLayoutParams.height = height;
    this.mFocusLayoutParams.leftMargin = left;
    this.mFocusLayoutParams.topMargin = top;
    this.mFocusView.layout(left, top, right, bottom);
}

}


  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 名为“Product”的列已属于此 DataTable
    • ¥15 安卓adb backup备份应用数据失败
    • ¥15 eclipse运行项目时遇到的问题
    • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
    • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
    • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
    • ¥50 成都蓉城足球俱乐部小程序抢票
    • ¥15 yolov7训练自己的数据集
    • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
    • ¥15 电力市场出清matlab yalmip kkt 双层优化问题