美文网首页viewAndroid研究院android
仿京东商品详情滑动头部折叠效果

仿京东商品详情滑动头部折叠效果

作者: 903d18a7bd21 | 来源:发表于2017-06-02 15:11 被阅读1029次

    之前看到京东安卓版商品详情页滑动时候头部折叠进去的效果感觉好舒服 于是就想知道怎么实现的

    • 先来看看京东的效果
    jd.gif
    • 不知道京东是怎么实现的,自己水平又低,我只能想到的是滑动速度不一致导致的视觉差 于是就这么做了 请忽略我丑丑的布局...
    ViewTreeObserver viewTreeObserver = ivShopPhoto.getViewTreeObserver();
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    llGoodDetail.getViewTreeObserver().removeGlobalOnLayoutListener(
                            this);
                    height = DeviceUtil.px2dip(ShopDetailActivity.this, ivShopPhoto.getHeight());
                    mSvShop.setOnMyScrollChangeListener(new MyNestedScrollView.ScrollInterface() {
                        @Override
                        public void onScrollChange(int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                            ivShopPhoto.setTranslationY(-scrollY / 3);
                            changeTitle(scrollY);
                        }
                    });
                }
    

    主要是setTranslationY让图片的偏移量为负的scrollview的三分之一

    ivShopPhoto.setTranslationY(-scrollY / 3);
    

    至于下面的changeTitle则与 本文无关 是监听滑动时候标题栏的渐变 ,顺便纪录下吧

    private void changeTitle(int scrollY) {
            if (scrollY <= 0) {   //设置标题的背景颜色
                llGoodDetail.setBackgroundColor(Color.argb(0, 255, 255, 255));
                tvShopTitle.setTextColor(Color.argb(0, 1, 24, 28));
                ivBack.setImageResource(R.drawable.icon_fanhui);
                ivShare.setImageResource(R.drawable.icon_fenxiang);
            } else if (scrollY > 0 && scrollY <= height) {
                //    滑动距离小于图的高度时,设置背景和字体颜色颜色透明度渐变
                float scale = (float) scrollY / height;
                float alpha = (255 * scale);
                tvShopTitle.setTextColor(Color.argb((int) alpha, 1, 24, 28));
                llGoodDetail.setBackgroundColor(Color.argb((int) alpha, 255, 255, 255));
                ivBack.setAlpha(alpha);
                ivShare.setAlpha(alpha);
            } else {    //滑动到图下面设置普通颜色
                llGoodDetail.setBackgroundColor(Color.argb(255, 255, 255, 255));
                tvShopTitle.setTextColor(Color.argb(255, 1, 24, 28));
                ivBack.setImageResource(R.drawable.iv_back);
                ivShare.setImageResource(R.drawable.iv_share);
            }
        }
    

    下面是我的xml文件

    <RelativeLayout
            android:id="@+id/ll_good_detail"
            android:layout_width="match_parent"
            android:layout_height="55dp"
            android:layout_gravity="top"
            android:background="#00000000">
    
            <ImageView
                android:id="@+id/iv_back"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:layout_margin="10dp"
                android:src="@drawable/icon_fanhui"/>
    
            <TextView
                android:id="@+id/tv_good_detail_title_good"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:text="商品详情"
                android:textColor="#00000000"
                android:textSize="18sp"/>
    
            <ImageView
                android:id="@+id/iv_share"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_margin="10dp"
                android:src="@drawable/icon_fenxiang"/>
        </RelativeLayout>
    

    记得在进来的时候初始化

     llGoodDetail.setBackgroundColor(Color.argb(0, 255, 255, 255));
     tvShopTitle.setTextColor(Color.argb(0, 1, 24, 28));
    
    • 回归正题,给图片设置了setTranslationY(-scrollY / *)到底可行吗?答案是可以的,看看下面的效果图
    after_error.gif

    可以看出,是实现效果了,虽然不怎么明显(这是因为页面内容不多所以滑动的距离太短,还有就是录制gif感觉跟看到的不一样了),但是滑动的时候会出现一段空白,这个呢是因为滑动速率不同造成的,怎么解决呢,可以给布局中添加一个透明的图片高度的view,造成一种假象,看起来ImageView在ScrollView中,其实则是image在下面,上面是个透明的占位图,看看布局代码就知道了

    布局.png
    • 再看看最终的效果
    after.gif
    • 再放出我之前没用这个的效果,其实gif录出来感觉效果好些没那么明显,实际用眼睛看起来,对比还是很强的,明显刚才那个效果就很舒服,感觉有了点灵气。 到这里就完了 看起来效果是相似的 也不知道京东怎么做的 但是肯定不是这样的
    normal.gif

    相关文章

      网友评论

      • Leeyp:其实只要设置setTranslationY(ScrollY / 2) [注意没有负号] 就能实现了 完全没必要弄一个透明占位控件
      • 背影_a132:楼主,问下我想在fragment里面使用折叠效果,你这种的能实现吗?android 自带的得继承AppCompatActivity。麻烦回复下hunluankj@126.com
      • a372b33ac54d:这样做,使用NestedScrollView,轮播图的点击和滑动事件会被拦截吗?
        a372b33ac54d:@Xiccc 是的,你的demo是可以滑动和点击查看大图?我仿照了你的做法,dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent一个都没走
        903d18a7bd21:@Lx_e102 我没有遇到这情况 你的出问题了吗?
      • 小新哥的大梦想:楼主github上有demo吗:flushed:
        小新哥的大梦想:@Xiccc 好的,感谢!!!!!:relaxed:
        903d18a7bd21: @小新新的大梦想 没写demo,在项目里,有时间我写一个吧。
      • yuyu000:很好 谢谢
        903d18a7bd21: @yuyu000 谢谢,我还很菜,一起加油!

      本文标题:仿京东商品详情滑动头部折叠效果

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