viewAndroid研究院android

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

2017-06-02  本文已影响1029人  903d18a7bd21

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

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));
after_error.gif

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

布局.png after.gif normal.gif
上一篇下一篇

猜你喜欢

热点阅读