StickyNavLayout

android-自定义控件-悬浮控件-仿360手机助手应用详情页

Github stars Tracking Chart

StickyNavLayout 悬浮控件

特点

  • 1.顶部支持ScrollView及ScrollView大于一屏幕的情况
  • 2.悬浮区域支持普通view,viewgroup
  • 3.内容支持GridView-GridViewWithHeaderAndFooterFragment(支持header和footer的GridView)
    ScrollView,ListView,RecyclerView以及对应的空布局及loading布局。
  • 4.支持在外面包装SwipeRefreshLayout,ultra-ptr 下拉刷新
  • 5.支持悬浮回调

#GridViewWithHeaderAndFooterFragment
https://github.com/liaohuqiu/android-GridViewWithHeaderAndFooter/
#声明
本项目纯属开源,只是为了更好的提高Android的开发技术,小宝贝们~~~~~

效果图




#自定义属性

<resources>
    <declare-styleable name="StickNavLayout">
        <!--默认是否悬停tab-->
        <attr name="isStickNav" format="boolean" />
        <!--距离悬浮的位置-->
        <attr name="stickOffset" format="dimension" />
    </declare-styleable>
</resources>

#stickOffset 属性细说
现在悬浮是当top区域完全滑动到屏幕外面时,中间的悬浮区域悬浮起来了,如果你有这么一种需求是距离悬浮区域有一定的距离比如(40dp)可以用这个属性,满足需求.

#使用时的注意事项
注意控件id的设置
top区域:id必须为: android:id="@+id/id_stickynavlayout_topview"
悬浮区域:id必须为: android:id="@+id/id_stickynavlayout_indicator"
内容区域:id必须为: android:id="@+id/id_stickynavlayout_viewpager"
内容区域
1.比需为ViewPager或者其子类
2.ViewPager的内容可以是Fragment,如果Fragment想用ListView,RecycleView等需要设置其id为:
android:id="@+id/id_stickynavlayout_innerscrollview"
比如:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.gxz.stickynavlayout.fragments.RecycleViewFragment">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/id_stickynavlayout_innerscrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</FrameLayout>

or

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


    <ScrollView
        android:id="@+id/id_stickynavlayout_innerscrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/msg"
            android:textSize="20sp" />

    </ScrollView>
</LinearLayout>

#使用

    <com.gxz.library.StickyNavLayout
        android:id="@+id/id_stick"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        stick:isStickNav="true">

        <LinearLayout
            android:id="@id/id_stickynavlayout_topview"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:background="#fee"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="top-view"
                android:textAllCaps="true"
                android:textSize="30sp" />
        </LinearLayout>

        <com.gxz.PagerSlidingTabStrip
            android:id="@+id/id_stickynavlayout_indicator"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:textSize="16sp"
            pst:pstsDividerColor="@color/colorPrimary"
            pst:pstsIndicatorColor="@color/colorPrimary"
            pst:pstsIndicatorHeight="5dp"
            pst:pstsScaleZoomMax="0"
            pst:pstsShouldExpand="false"
            pst:pstsTextSelectedColor="#303F9F"
            pst:pstsUnderlineColor="@color/colorPrimary" />

        <android.support.v4.view.ViewPager
            android:id="@id/id_stickynavlayout_viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </com.gxz.library.StickyNavLayout>

#TopView(顶部区域大于一屏)

<?xml version="1.0" encoding="utf-8"?>
<in.srain.cube.views.ptr.PtrClassicFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
    xmlns:pst="http://schemas.android.com/apk/res-auto"
    xmlns:stick="http://schemas.android.com/apk/res-auto"
    android:id="@+id/store_house_ptr_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    cube_ptr:ptr_duration_to_close="300"
    cube_ptr:ptr_duration_to_close_header="2000"
    cube_ptr:ptr_keep_header_when_refresh="true"
    cube_ptr:ptr_pull_to_fresh="false"
    cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
    cube_ptr:ptr_resistance="1.7">

    <com.gxz.library.StickyNavLayout
        android:id="@+id/id_stick"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        stick:isStickNav="false">
            <!--顶部区域为ScrollView-->
        <ScrollView
            android:id="@id/id_stickynavlayout_topview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#fee"
                android:orientation="vertical">

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:text="@string/msg"
                    android:textAllCaps="true"
                    android:textSize="20sp" />
            </LinearLayout>
        </ScrollView>

        <com.gxz.PagerSlidingTabStrip
            android:id="@+id/id_stickynavlayout_indicator"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:textSize="16sp"
            pst:pstsDividerColor="@color/colorPrimary"
            pst:pstsIndicatorColor="@color/colorPrimary"
            pst:pstsIndicatorHeight="5dp"
            pst:pstsScaleZoomMax="0"
            pst:pstsShouldExpand="false"
            pst:pstsTextSelectedColor="#303F9F"
            pst:pstsUnderlineColor="@color/colorPrimary" />

        <android.support.v4.view.ViewPager
            android:id="@id/id_stickynavlayout_viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </com.gxz.library.StickyNavLayout>
</in.srain.cube.views.ptr.PtrClassicFrameLayout>

Java 代码使用

相信你可以点一下就知道什么用了 .... 是不是呢?小宝贝~~~!!

#接口回调

 stickyNavLayout.setOnStickStateChangeListener(new StickyNavLayout.onStickStateChangeListener() {
            @Override
            public void isStick(boolean isStick) {
                
            }

            @Override
            public void scrollPercent(float percent) {

            }
        });

#Maven

<dependency>
        <groupId>com.gxz.stickynavlayout</groupId>
        <artifactId>library</artifactId>
        <version>1.3.2</version>
        <type>jar</type>
        <classifier>sources</classifier>
</dependency>

Gradle


    compile 'com.gxz.stickynavlayout:library:1.3.2'
    

#Demo
Demo中的导航控件是:PagerSlidingTabStrip
是我一个开源项目:
https://github.com/ta893115871/PagerSlidingTabStrip/

#V1.1版本
1.增加如果TopView大于一屏TopView无法显示的问题,比如顶部区域为ScrollView
2.支持顶部区域可以是ScrollView

#V1.2版本
1.修复TOP区域中不支持控件动态GONE/VISIBLE的BUG
使用用法,设置完GONE/VISIBLE后调用updateTopViews();方法

    @OnClick(R.id.show)
    public void show() {
        button1.setVisibility(View.VISIBLE);
//        button2.setVisibility(View.VISIBLE);
        linearLayoutLayout.setVisibility(View.VISIBLE);
        stickyNavLayout.updateTopViews();
    }

    @OnClick(R.id.hide)
    public void hide() {
        button1.setVisibility(View.GONE);
//        button2.setVisibility(View.GONE);
        linearLayoutLayout.setVisibility(View.GONE);
        stickyNavLayout.updateTopViews();
    }

再次 如果你动态修改了top区域中有关view(比如TextView的文本-这时高度就变了),这是你需要在修改完后重新调用如下方法,更新高度
比如:

 textViewMsg.setText(getResources().getString(R.string.msg));
 stickyNavLayout.updateTopViews();

从而可以避免topView有空白或者高度不够的问题

2.增加setStickNavAndScrollToNav方法.
该方法的意思是:java代码动态设置悬浮,并自动滚动到悬浮位置(即把top区域滚动上去),详细见demo中的TopOperateActivity

#V1.3版本
修改因1.2版本造成的stickOffset不起作用的问题
#V1.3.1版本
修改stickOffset造成内容区域底部显示不全问题,最近丢三落四的!
#V1.3.2版本
修改一些bug

Main metrics

Overview
Name With Ownerta893115871/StickyNavLayout
Primary LanguageJava
Program languageJava (Language Count: 1)
Platform
License:zlib License
所有者活动
Created At2016-01-01 08:37:35
Pushed At2016-12-13 10:19:45
Last Commit At2016-12-13 18:19:37
Release Count0
用户参与
Stargazers Count450
Watchers Count14
Fork Count87
Commits Count21
Has Issues Enabled
Issues Count54
Issue Open Count20
Pull Requests Count0
Pull Requests Open Count0
Pull Requests Close Count1
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private