对开源库PullToZoomInListView的理解

开源项目PullToZoomInListView的git地址:git地址

效果:

1.当往下拉时,顶部Image 放大,松手时,这个Image自动缩小到原始大小

2.当往上拉时,顶部Image上下(这个Image距离顶部 和 距离底部第一个Item)同时缩小



个人理解:

一:当往下拉时,顶部Image 放大

实现这个效果的做法:

1.  new 一个FrameLayout和ImageView,设置这个ImageView的资源图片以及ScaleType,并用这个frameLayout .addView(ImageView),最后ListView添加headerView(FrameLayout)。

2.  自定义ScalingRunnable implements Runnable,在run方法里,循环post(this),重新设置FrameLayout的height(height通过Interpolator sInterpolator 来修改),来达到这个效果的。

 private static final Interpolator sInterpolator = new Interpolator() {
        public float getInterpolation(float t) {
            t -= DEFAULT_MIN_SCALE;
            return (t * t * t * t * t) + DEFAULT_MIN_SCALE;
        }
    };
 class ScalingRunnable implements Runnable {
        long mDuration;
        boolean mIsFinished = true;
        float mScale;
        long mStartTime;

        public boolean isFinished() {
            return mIsFinished;
        }

        public void abortAnimation() {
            mIsFinished = true;
        }

        public void startAnimation(long duration) {
            mStartTime = SystemClock.currentThreadTimeMillis();
            mDuration = duration;
            mScale = ((float) mHeaderContainer.getBottom()) / ((float) mHeaderHeight);
            mIsFinished = false;
            post(this);
        }

        public void run() {
            if (!mIsFinished && ((double) mScale) > 1.0d) {
                float scale = mScale - ((mScale - DEFAULT_MIN_SCALE) * sInterpolator.getInterpolation((((float) SystemClock.currentThreadTimeMillis()) - ((float) mStartTime)) / ((float) mDuration)));
                ViewGroup.LayoutParams params = mHeaderContainer.getLayoutParams();
                if (scale <= DEFAULT_MIN_SCALE) {
                    mIsFinished = true;
                    params.height = mHeaderHeight;
                } else {
                    params.height = (int) (((float) mHeaderHeight) * scale);
                }
                mHeaderContainer.setLayoutParams(params);
                post(this);
            }
        }
    }


二:当往上推时,顶部ImageView 既往上滑动,被状态栏覆盖,同时也被ListView  headView下面的Item覆盖

实现这个效果的做法:

1.  被状态栏覆盖 是因为 listview本身 就有这个效果,当超过一屏,往上推时,上面的Item会被覆盖掉。


2.  被ListView  headView下面的Item覆盖,是通过 ImageView 的scrollTo实现的。

 float scrollY = (float) (mHeaderHeight - mHeaderContainer.getBottom());
            if (scrollY > 0.0f && scrollY < ((float) mHeaderHeight)) {
                mHeaderImage.scrollTo(0, -((int) (((double) scrollY) * 0.65d)));
            } else if (mHeaderImage.getScrollY() != 0) {
                mHeaderImage.scrollTo(0, 0);
            }


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PJ佩恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值