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 微带串馈天线阵列每个阵元宽度计算
    • ¥15 关于无人驾驶的航向角
    • ¥15 keil的map文件中Image component sizes各项意思
    • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
    • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
    • ¥15 划分vlan后,链路不通了?
    • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
    • ¥15 Vue3 大型图片数据拖动排序
    • ¥15 Centos / PETGEM
    • ¥15 划分vlan后不通了