美文网首页
ViewPager不为人知的秘密

ViewPager不为人知的秘密

作者: fuwenju | 来源:发表于2017-12-31 17:49 被阅读0次

ViewPager切换Page之修改默认滑动偏移量

把ViewPager源码复制一份,修改determineTargetPage方法,determineTargetPage这个方法就是计算接下来要滑到哪一页。这个方法调用是在MotionEvent.ACTION_UP这个事件下,先说下参数意思:

currentPage:当前ViewPager显示的页面
pageOffset:用户滑动的页面偏移量
velocity: 滑动速率
deltaX: X方向移动的距离

/** 最小可切换Page的偏移量**/ 

private float minPageOffset = 0.6f; 

public void setMinPageOffset(float pageOffset){ 

    minPageOffset = pageOffset; 

} 

private int determineTargetPage(int currentPage, float pageOffset, int velocity, int deltaX) { 

    int targetPage; 

    if (Math.abs(deltaX) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity) { 

        targetPage = velocity > 0 ? currentPage : currentPage + 1; 

    } else { 

        final float truncator = currentPage >= mCurItem ? 1.0f - minPageOffset : minPageOffset; 

        targetPage = (int) (currentPage + pageOffset + truncator); 

    } 



    if (mItems.size() > 0) { 

        final ItemInfo firstItem = mItems.get(0); 

        final ItemInfo lastItem = mItems.get(mItems.size() - 1); 



        // Only let the user target pages we have items for 

        targetPage = Math.max(firstItem.position, Math.min(targetPage, lastItem.position)); 

    } 



    return targetPage; 

} 

ViewPager设置子View是否能滑动

改写 ViewPager源码 canScroll(View v, boolean checkV, int dx, int x, int y) 方法返回值

ViewPager之垂直方向的ViewPager以及transformer

https://github.com/kaelaela/VerticalViewPager

ViewPager强制刷新UI

ViewPager不能动态刷新UI的原因主要是因为PagerAdapter中调用notifyDataSetChanged是会失效的,当ViewPager绘制完Item之后,ViewPager会把child标记为POSITION_UNCHANGED,这样就不会在notifyDataSetChanged后更新这个View了。当我们调用PagerAdapter的notifyDataSetChanged方法之后,系统会去Adapter的getItemPosition方法中遍历所有的child,我们在getItemPosition方法中改写返回值POSITION_NONE,表示child都没有绘制过,这样ViewPager就会去重绘了。

@Override

public void notifyDataSetChanged() {

    mChildCount = getCount();

    super.notifyDataSetChanged();

}



@Override

public int getItemPosition(Object object) {

    // 重写getItemPosition,保证每次获取时都强制重绘UI

    if (mChildCount > 0) {

        mChildCount--;

        return POSITION_NONE;

    }

    return super.getItemPosition(object);

}

我们增加一个mChildCount来记录子类的数量,在一定程度上减少重绘的次数。
因为重绘的时候,ViewPager会的Destory Item,增加了系统开销。

更加优化的方法

当我们只需要对ViewPager中的某些元素进行更新时,我们可以在instantiateItem方法调用时,用View.setTag方法加入标志,在需要更新View时,通过findViewWithTag的方法找到对应的View进行更新。

相关文章

  • ViewPager不为人知的秘密

    ViewPager不为人知的秘密 ViewPager翻页控制 关于控制ViewPager的翻页,在网上已经有很多解...

  • ViewPager相关-NoScrollViewPager

    NoScrollViewPager 另外,ViewPager的常见问题,可以参看这里ViewPager不为人知的秘密

  • ViewPager不为人知的秘密

    ViewPager切换Page之修改默认滑动偏移量 把ViewPager源码复制一份,修改determineTar...

  • 端午节,那些不为人知的秘密..

    端午节,那些不为人知的秘密...

  • 2020-06-25

    似乎 我们 总喜欢在不为人知的地方 写下不为人知的心情 诉说着不为人知的故事 还有 不能说的秘密

  • 书香||心酸的秘密

    所谓的秘密,指有所隐蔽,不为人知,隐蔽不为人知的事情或事物。秘密是不能言说的隐秘,我自认为是个简单的人,从小到大几...

  • 幻想

    我幻想着,在每一个背后都有不为人知的秘密;我幻想着,在这不为人知的秘密里藏着一个惊天的答案,那个答案可以带我去天空...

  • 2017-12-21

    每一个光鲜靓丽的背后都有不为人知的秘密。

  • 出世乱天象

    在很久很久以前,总有那么一些地方不为人知,也总有些不为人知的事情,不为人知的秘密。隐藏在那个世界的每个角落以及何其...

  • 《终极一班》金宝三藏不住的秘密,就差把“想要脱单”写在脑门上

    文/苏小妹 你有秘密吗?你是一个能守住秘密的人吗?很多人或多或少都有些不为人知的秘密,有的是大秘密,有的是小秘密。...

网友评论

      本文标题:ViewPager不为人知的秘密

      本文链接:https://www.haomeiwen.com/subject/ddsagxtx.html