可用于商品展示的锚点定位加联动布局
项目地址:https://github.com/BitToNet/FeloneHelper/blob/master/README.md#可用于商品展示的锚点定位加联动布局
演示
这个是网上找的一个项目,修复了一些bug
- 自定义的ScrollView会造成他子类里面包含的recycleview加载不全
- 从底部滑到顶部后再次跳转回混乱
- recycleview充当子类的时候占用父类的touch事件造成卡顿
原始项目地址:
https://github.com/taixiang/tabScroll
使用方法
演示代码入口在CActivity里面,能看懂代码就不用看下面了
添加依赖
dependencies {
api "com.android.support:design:${SUPPORT_VERSION}"
}
1.拷贝自定义widget/CustomScrollView
2.添加布局,在id为ll_top的LinearLayout里加头部
3.拷贝CActivity中四个方法,并在init中处理自己的数据
4.仿写一个AnchorView,在布局R.layout.view_anchor自定义自己的子模块界面
特别注意:
如果子模块中加了recycleview,一定要加这么一条代码
recyclerView.setNestedScrollingEnabled(false);
原理阐述(很简单)
1.自定义NestedScrollView
新建CustomScrollView继承NestedScrollView,通过回调讲两个方法暴露出去
onScrollChanged(滚动监听)
onInterceptTouchEvent(事件分发,监听它的原因是有时候CustomScrollView里面的子view会消费事件,导致CustomScrollView接受不到事件,所以在分发的时候传给CustomScrollView)
代码如下:
public class CustomScrollView extends NestedScrollView {
public Callbacks mCallbacks;
public CustomScrollView(Context context) {
super(context);
}
public CustomScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setCallbacks(Callbacks callbacks) {
this.mCallbacks = callbacks;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mCallbacks != null) {
mCallbacks.onScrollChanged(l, t, oldl, oldt);
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (mCallbacks != null) {
mCallbacks.ontouch(ev);
}
return super.onInterceptTouchEvent(ev);
}
//定义接口用于回调
public interface Callbacks {
void onScrollChanged(int x, int y, int oldx, int oldy);
void ontouch(MotionEvent ev);
}
}