频道栏目
首页 > 程序开发 > 移动开发 > 其他 > 正文
如何去解决AppBarLayout在华为手机6.0系统快速滑动时抖动问题
2018-08-25 10:24:04           
收藏   我要投稿

最近有个需求要做类似UC、今日头条标题栏吸附悬停效果,相信大家会用CoordinatorLayout+AppBarLayout来实现,于是加入了项目中,效果是实现了,玩得很愉快,可是玩了一会发现一个原生的bug,问题描述如下:

用手指轻轻滑动CoordinatorLayout部分(, 上滑, 快速抬起手指, 形成一个fling操作. 其实就是向上滑动一下.这时, 整个CoordinatorLayout部分会向上移动(fling), 在停止移动之前, 在下面的白色区域(也就是xml布局中的NestedScrollView)来一个反向的滑动(fling) , 这时整个页面就会开始或大或小的抖动, 非常明显.

屏幕录制如下:

\
标题

解决问题的方法如下:

自定义AppBarLayout的Behavior代码:
/**
 * 自定义AppBarLayout的Behavior解决华为手机6.0系统抖动问题
 */
public class CustomBehavior extends AppBarLayout.Behavior {
 private OverScroller mScroller;

 public CustomBehavior() {
 }

 public CustomBehavior(Context context, AttributeSet attrs) {
  super(context, attrs);
  getParentScroller(context);
 }

 /**
  * 反射获得滑动属性。
  *
  * @param context
  */
 private void getParentScroller(Context context) {
  if (mScroller != null) return;
  mScroller = new OverScroller(context);
  try {
Class reflex_class = getClass().getSuperclass().getSuperclass();//父类AppBarLayout.Behavior父类的父类HeaderBehavior
Field fieldScroller = reflex_class.getDeclaredField("mScroller");
fieldScroller.setAccessible(true);
fieldScroller.set(this, mScroller);
  } catch (Exception e) {
  }
 }

 //fling上滑appbar然后迅速fling下滑recycler时, HeaderBehavior的mScroller并未停止, 会导致上下来回晃动
 @Override
 public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) {
  if (mScroller != null) { //当recyclerView 做好滑动准备的时候 直接干掉Appbar的滑动
if (mScroller.computeScrollOffset()) {
 mScroller.abortAnimation();
}
  }
  if (type == ViewCompat.TYPE_NON_TOUCH && getTopAndBottomOffset() == 0) { //recyclerview的惯性比较大 ,会顶在头部一会儿, 到头直接干掉它的滑动
ViewCompat.stopNestedScroll(target, type);
  }
  super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
 }

 @Override
 public boolean onTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent e) {

  switch (e.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
 break;
  }

  return super.onTouchEvent(parent, child, e);
 }

在布局中的使用方法如下:

\


大家可以亲自体验下没有加自定义的Behavior会出现啥问题,最后放上完整代码地址

https://gitee.com/jackning_admin/AppBarLayoutDemo

点击复制链接 与好友分享!回本站首页
上一篇:appium+python小试牛刀之薅羊毛
下一篇:iOS导航栏背景颜色,背景图片,标题字体颜色大小,透明度渐变,去除导航栏下划线等一系列问题解决
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站