android Recyclerview仿京东,滚动屏幕标题栏渐变(启动页面动画)

简介:

首先,本文代码部分参考了conglida博主写的自定义scrollview 实现标题栏渐变:

http://download.csdn.net/download/conglida/9183723

此资源只使用自定义scrollview 实现标题栏渐变和上拉下拉刷新。如果需要listview,等其他控件,需实现onScrollListener,在onscroll中嵌入渐变代码。

再次感谢conglida博主的无私奉献!


由于Recyclerview已经推出很长时间了,不得不说这个控件确实好,可以替代scrollview、listview、gridview,功能很强大,目前我已经用这个新控件实现了标题栏渐变的效果。


本代码使用了三方开源组件:

HeaderAndFooterRecyclerView是支持addHeaderView、 addFooterView、分页加载的RecyclerView解决方案,滑动底部自动加载更多。

项目地址:https://github.com/cundong/HeaderAndFooterRecyclerView

开始正题。

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/app_bg"
    android:orientation="vertical"
    >

    <include
        android:id="@+id/load_view"
        layout="@layout/pull_to_load_footer"
        android:visibility="gone" />
    <android.support.v4.widget.SwipeRefreshLayout
         android:id="@+id/swipe_container"
         android:layout_width="match_parent"
         android:layout_height="match_parent" >
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
        </android.support.v4.widget.SwipeRefreshLayout>


    <RelativeLayout
        android:id="@+id/index_title_bar"
        android:layout_alignParentTop="true"
        style="@style/title_bar_style_home_v19"
        android:fitsSystemWindows="true"
        android:gravity="center"
        android:paddingTop="@dimen/title_bar_padding_top"
        >

        <TextView
            android:id="@+id/current_city_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:drawableTop="@drawable/ic_location"
            android:drawablePadding="2dp"
            android:text="北京"
            android:textColor="#fff"
            android:textSize="10sp" />

        <TextView
            android:id="@+id/tv_title"
            android:layout_centerVertical="true"
            android:layout_width="match_parent"
            android:layout_height="33dp"
            android:gravity="center_vertical"
            android:layout_weight="10"
            android:background="@drawable/shape_edit_corners_bg"
            android:hint="请输入商品名称"
            android:imeOptions="actionSearch"
            android:singleLine="true"
            android:textColor="@color/black_text"
            android:textColorHint="#ffb6b6b6"
            android:textSize="14sp"
            android:maxLength="10"
            android:paddingLeft="5dp"
            android:paddingRight="3dp"
            android:drawableLeft="@drawable/ic_search"
            android:drawableRight="@drawable/bg_btn_voice"
            android:layout_toLeftOf="@+id/image_right"
            android:layout_toRightOf="@+id/current_city_text"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"/>

        <TextView
            android:id="@+id/image_right"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="10dp"
            android:drawableTop="@drawable/ic_category"
            android:drawablePadding="2dp"
            android:text="分类"
            android:textColor="#fff"
            android:textSize="10sp" />

    </RelativeLayout>
</RelativeLayout>

部分代码:

CommonHeader headerView;
    private void initView(View view) {

        mSwipeRefreshLayout = (SwipeRefreshLayout)view.findViewById(R.id.swipe_container);
        mSwipeRefreshLayout.setProgressViewOffset(false, 0, Util.dip2px(getActivity(), 92));
        //设置刷新时动画的颜色,可以设置4个
        mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light);
        mSwipeRefreshLayout.setOnRefreshListener(this);
        mSwipeRefreshLayout.setRefreshing(true);

        mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        mGridAdapter = new HotsGridAdapter(getActivity(),mHandler);
        mHeaderAndFooterRecyclerViewAdapter = new HeaderAndFooterRecyclerViewAdapter(mGridAdapter);
        mRecyclerView.setAdapter(mHeaderAndFooterRecyclerViewAdapter);

        layoutManager = new GridLayoutManager(getActivity(), 2);
        layoutManager.setSpanSizeLookup(new HeaderSpanSizeLookup((HeaderAndFooterRecyclerViewAdapter) mRecyclerView.getAdapter(), layoutManager.getSpanCount()));
        layoutManager.setOrientation(GridLayoutManager.VERTICAL);
        layoutManager.setSmoothScrollbarEnabled(true);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(layoutManager);

        headerView = new CommonHeader(getActivity(),R.layout.layout_home_header);
        RecyclerViewUtils.setHeaderView(mRecyclerView, headerView);

        mTitlebar = (RelativeLayout) view.findViewById(R.id.index_title_bar);
        mTitlebar.setVisibility(View.VISIBLE);
        mTitlebar.getBackground().setAlpha(0);
        keyTextView = (TextView) mTitlebar.findViewById(R.id.tv_title);
        mCurCityText = (TextView) mTitlebar.findViewById(R.id.current_city_text);
        categorizeTextView = (TextView) view.findViewById(R.id.image_right);

        slideShowView = (SlideShowView) headerView.findViewById(R.id.slideshowView);
        moreSpecialProduct = headerView.findViewById(R.id.special_more);

        mCurCityText.setOnClickListener(this);
        keyTextView.setOnClickListener(this);
        moreSpecialProduct.setOnClickListener(this);
        categorizeTextView.setOnClickListener(this);

        slideShowView = (SlideShowView) headerView.findViewById(R.id.slideshowView);
        cart_btn = getActivity().findViewById(R.id.shop_cart_btn);
        animation_viewGroup = createAnimLayout();

        imageLoader = ImageLoader.getInstance();
        mRecyclerView.addOnScrollListener(mOnScrollListener);


    }

关键代码:

headerView = new CommonHeader(getActivity(),R.layout.layout_home_header);
        RecyclerViewUtils.setHeaderView(mRecyclerView, headerView);

为RecyclerView添加headerview,headview包括了所有的其他view,如下图所示,所看到的view都包含在headerView里面,不包括titlebar哦




滑动监听事件:

boolean pauseOnScroll = false, pauseOnFling=true;
    private RecyclerOnScrollListener mOnScrollListener = new RecyclerOnScrollListener() {

        @Override
        public void onScrolled(int dx, int dy) {
            super.onScrolled(dx, dy);
            if (slideShowView.getHeight() > 0) {
                //define it for scroll height
                int lHeight = slideShowView.getHeight();
                if(dy < 0){
                    mTitlebar.getBackground().setAlpha(0);
                }else {
                    if (dy < lHeight) {
                        int progress = (int) (new Float(dy) / new Float(lHeight) * 200);//255
                        mTitlebar.getBackground().setAlpha(progress);
                    } else {
                        mTitlebar.getBackground().setAlpha(255 - 55);
                    }
                }

            }

        }

        @Override
        public void onBottom() {
            super.onBottom();
            Log.d(TAG, "onBottom");
            LoadingFooter.State state = RecyclerViewStateUtils.getFooterViewState(mRecyclerView);
            if(state == LoadingFooter.State.Loading) {
                Log.d(TAG, "the state is Loading, just wait..");
                return;
            }

            if (mCurPageIndex < totalPage) {
                // loading more
                RecyclerViewStateUtils.setFooterViewState(getActivity(), mRecyclerView, REQUEST_COUNT, LoadingFooter.State.Loading, null);
                mHandler.sendEmptyMessage(GET_LIST_DATA);
                Log.d(TAG, "onBottom loading");
            } else {
                //the end
                RecyclerViewStateUtils.setFooterViewState(getActivity(), mRecyclerView, REQUEST_COUNT, LoadingFooter.State.TheEnd, null);
            }
        }

        @Override
        public void onScrollStateChanged(int newState) {
            //根据newState状态做处理
            if (imageLoader != null) {
                switch (newState) {
                    case 0:
                        imageLoader.resume();
                        break;

                    case 1:
                        if (pauseOnScroll) {
                            imageLoader.pause();
                        } else {
                            imageLoader.resume();
                        }
                        break;

                    case 2:
                        if (pauseOnFling) {
                            imageLoader.pause();
                        } else {
                            imageLoader.resume();
                        }
                        break;
                }
            }
        }


    };

代码中涉及到的封装控件下载:http://download.csdn.net/detail/jdsjlzx/9391838,没有demo,请大家自行实现效果。

具体原理请参考

conglida博主写的自定义scrollview 实现标题栏渐变:

http://download.csdn.net/download/conglida/9183723

相关文章
|
4月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
97 2
基于Android P,自定义Android开机动画的方法
|
2月前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
3月前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
292 9
|
3月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
81 8
|
4月前
|
存储 安全 物联网
Android经典实战之跳转到系统设置页面或其他系统应用页面大全
本文首发于公众号“AntDream”,关注获取更多技巧。文章总结了Android开发中跳转至系统设置页面的方法,包括设备信息、Wi-Fi、显示与声音设置等,并涉及应用详情与电池优化页面。通过简单的Intent动作即可实现,需注意权限与版本兼容性。每日进步,尽在“AntDream”。
537 2
|
4月前
|
存储 Android开发 开发者
Android项目架构设计问题之定义RecyclerView的ViewHolder如何解决
Android项目架构设计问题之定义RecyclerView的ViewHolder如何解决
55 0
|
4月前
|
数据可视化 Java 数据挖掘
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
41 0
|
4月前
|
监控 安全 API
Android项目架构设计问题之保证线上用户不会进入到本地配置页面如何解决
Android项目架构设计问题之保证线上用户不会进入到本地配置页面如何解决
35 0
|
4月前
|
Android开发
Android项目架构设计问题之定义一个关闭当前页面的Action如何解决
Android项目架构设计问题之定义一个关闭当前页面的Action如何解决
22 0