(转)仿CSDN客户端首页(一)----TabLayout实现选项卡滑动效果

原地址:http://blog.csdn.net/tyk0910/article/details/51395064


实际开发中,ViewPager经常结合Fragment来使用,然后再使用三方开源的PagerSlidingTabStrip去实现类似选项卡滑动效果。我之前那个APP的首页就是这样搭建的。 
基于Material Design设计的分享文字图片的APP

现在,我们可以和这种方式说拜拜了。先看效果图: 
这里写图片描述

可以随意添加标题,可以修改标题与指示器样式,可以快速滑动选择标题。和当前主流APP的首页效果还是很像的。而这一切,只需要今天的主角—-TabLayout来帮你搞定即可。

Google在2015的IO大会上,给我们带来了Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,给我们提供了更加规范的MD设计风格的控件。最重要的是,Android Design Support Library的兼容性更广,直接可以向下兼容到Android 2.2。TabLayout是Android Design Support Library库中的控件。

来看看怎么使用:

1.准备工作: 
在build.gradle加入如下代码:

    compile 'com.android.support:design:22.2.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
 
 
  • 1
  • 2

2.布局文件:

    <android.support.design.widget.TabLayout
        android:id="@+id/tab"
        android:layout_width="match_parent"
        android:layout_height="50dp">
    </android.support.design.widget.TabLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white" />
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上面是我们的TabLayout,其中属性配置在后面会进行设置,下面就是熟悉的viewpager

3.代码实现:

public class TabLayoutActivity extends AppCompatActivity {


    private TabLayout tab;
    private ViewPager viewpager;
    private TabAdapter adapter;
    public static final String[] tabTitle = new String[]{"综艺", "体育", "新闻", "热点", "头条", "军事", "历史", "科技", "人文", "地理"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tab_layout);
        initviews();
    }

    private void initviews() {
        tab = (TabLayout) findViewById(R.id.tab);
        viewpager = (ViewPager) findViewById(R.id.viewpager);

        List<Fragment> fragments = new ArrayList<>();
        for (int i = 0; i < tabTitle.length; i++) {
            fragments.add(TabLayoutFragment.newInstance(i + 1));
        }
        adapter = new TabAdapter(getSupportFragmentManager(), fragments);
        //给ViewPager设置适配器
        viewpager.setAdapter(adapter);
        //将TabLayout和ViewPager关联起来。
        tab.setupWithViewPager(viewpager);
        //设置可以滑动
        tab.setTabMode(TabLayout.MODE_SCROLLABLE);
    }


}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

准备好taTitle数组,适配器,然后给Viewpager设置适配器,将TabLayout和ViewPager关联起来,最后就是设置tab可以滑动,不然标题太多,会挤满上方屏幕。再来看看Adapter的代码:

public class TabAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;


    public TabAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }


    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    //设置tablayout标题
    @Override
    public CharSequence getPageTitle(int position) {
        return TabLayoutActivity.tabTitle[position];

    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

记得加上设置tablayout这个方法。接下来就是fragment的代码了:

/**
 * Created by tangyangkai on 16/5/12.
 */
public class TabLayoutFragment extends Fragment {
    public static String TABLAYOUT_FRAGMENT = "tab_fragment";
    private TextView txt;
    private int type;

    public static TabLayoutFragment newInstance(int type) {
        TabLayoutFragment fragment = new TabLayoutFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable(TABLAYOUT_FRAGMENT, type);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            type = (int) getArguments().getSerializable(TABLAYOUT_FRAGMENT);
        }

    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_tablayout, container, false);
        initView(view);
        return view;
    }


    protected void initView(View view) {
        txt = (TextView) view.findViewById(R.id.tab_txt);


        switch (type) {
            case 1:
                txt.setText("这是综艺Fragment");
                break;
            case 2:
                txt.setText("这是体育Fragment");
                break;
            case 3:
                txt.setText("这是新闻Fragment");
                break;
            case 4:
                txt.setText("这是热点Fragment");
                break;
            case 5:
                txt.setText("这是头条Fragment");
                break;
            case 6:
                txt.setText("这是军事Fragment");
                break;
            case 7:
                txt.setText("这是历史Fragment");
                break;
            case 8:
                txt.setText("这是科技Fragment");
                break;
            case 9:
                txt.setText("这是人文Fragment");
                break;
            case 10:
                txt.setText("这是地理Fragment");
                break;
        }


    }

}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

关于使用setArguments()来创建Fragment,这种方法在上一篇博客里面着重给大家推荐了

从BaseActivity与BaseFragment的封装谈起

这里我们再一次看到了其中的好处,就是fragment的复用。根据传递过来的不同参数,显示不同的界面。TabLayout非常适合那种界面相差不大的,就像CSDN客户端首页,都是显示技术类文章,只是分类不一样而已。

当然,你要是说,要是我这些界面差异很大怎么办,没问题:

  List<Fragment> fragments = new ArrayList<>();
        for (int i = 0; i < tabTitle.length; i++) {
            fragments.add(TabLayoutFragment.newInstance(i + 1));
        }
 
 
  • 1
  • 2
  • 3
  • 4

我在这里放进不同的fragment即可。原则就是:相似的我就复用,不一样的我就新增

图示效果是默认样式的,要是想修改一下文字,指示器样式咋办,很简单:

官方的 TabLayout 没有提供修改 TextView size 的方法,可以新建一个 style CustomTabLayoutTextAppearance 继承 TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse ,然后增加 item 再设置 android:textSize 为你想设置的大小。

 <style name="MyTabLayoutTextAppearanceInverse" parent="TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse">
        <item name="android:textSize">20sp</item>
    </style>
 
 
  • 1
  • 2
  • 3

XML文件中使用:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:tabTextAppearance="@style/MyTabLayoutTextAppearanceInverse"
    tools:context="com.example.tangyangkai.testdemo.TabLayoutActivity">


    <android.support.design.widget.TabLayout
        android:id="@+id/tab"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:tabSelectedTextColor="@color/colorAccent"
      app:tabTextAppearance="@style/MyTabLayoutTextAppearanceInverse"
        app:tabTextColor="@color/colorPrimary"
        app:tabIndicatorColor="@color/colorAccent">

    </android.support.design.widget.TabLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white" />

</LinearLayout>
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

依次是设置选中字体颜色,大小,正常颜色,以及指示器的颜色,看完改完的效果: 
这里写图片描述

纯属演示,大家可以自己设置自己喜欢的风格。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~分割线

无意间看到别的APP的首页,好多好看的效果。果断去github了一把,果然找到了。

上图: 
这里写图片描述

给大家链接地址:

https://github.com/H07000223/FlycoTabLayout

感兴趣的可以研究研究。

收工!!!又到周五啦,大家周末愉快


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: csdn nginx-http-flv-win32是一个基于Nginx服务器的项目,用于通过HTTP协议实现FLV流媒体的传输和播放。 Nginx是一个高性能的开源Web服务器和反向代理服务器,常用于构建高并发、高可靠性的网站和应用程序。csdn nginx-http-flv-win32则是在Nginx的基础上开发的一个模块,特别用于处理FLV格式的媒体文件的传输和播放。 FLV是一种常用的流媒体格式,常用于实时传输和播放视频和音频内容。通过csdn nginx-http-flv-win32模块,可以将FLV文件进行解析和分片,并以HTTP的方式传输给客户端实现流媒体的直播和点播功能。 csdn nginx-http-flv-win32还具有一些额外的特性,例如支持跨域访问、实时推流等。通过跨域访问支持,可以实现在不同的域名之间进行流媒体的传输和播放。实时推流功能则可以将实时摄像头的视频流以FLV格式传输给客户端实现实时直播功能。 此外,csdn nginx-http-flv-win32还支持基于SSL的安全传输,提高传输的安全性。通过将Nginx服务器配置为HTTPS服务器,可以实现对FLV流的加密传输,确保传输过程中的数据安全。 综上所述,csdn nginx-http-flv-win32是一个构建在Nginx服务器上的模块,可以通过HTTP协议实现FLV流媒体的传输和播放,并具有一些额外的特性,如跨域访问和实时推流等。它可以应用于各种需要流媒体传输的场景,如在线直播、点播等。 ### 回答2: csdn nginx-http-flv-win32是一个基于Nginx服务器的开源项目,旨在实现HTTP-FLV(HTTP-based FLV)的流媒体传输和播放。 HTTP-FLV是一种在Web上实现流媒体传输和播放的协议,它使用HTTP协议进行数据传输,并使用FLV(Flash Video)格式来编码和解码音视频数据。 csdn nginx-http-flv-win32项目提供了一个高性能的HTTP-FLV流媒体服务器解决方案,可以轻松地构建自己的流媒体服务。 该项目提供了一个针对Windows系统的编译版本,方便Windows用户快速搭建自己的流媒体服务器,无需自行编译和配置。 使用csdn nginx-http-flv-win32,您可以将音视频文件换为FLV格式,并通过HTTP协议进行传输和播放。它还支持实时的音视频采集和编码,可以将摄像头或麦克风的输入直接传输到流媒体服务器,并在Web浏览器中进行实时播放。 csdn nginx-http-flv-win32具有低延迟、高并发、高可靠性的特点,适用于各种场景,如网络直播、视频点播、在线教育等。 总之,csdn nginx-http-flv-win32是一个方便快捷的流媒体服务器解决方案,可以助用户实现高性能的HTTP-FLV流媒体传输和播放。无论是个人还是企业,都可以利用它搭建自己的流媒体服务,提供更好的音视频体验。 ### 回答3: CSDN是一个IT技术社区,提供了各种技术方面的文章、教程、问答等内容,助开发者、工程师等解决问题、学习新知识。其中,nginx-http-flv-win32是一个特定版本的NGINX,用于实现HTTP-FLV协议的流媒体传输。 NGINX是一个轻量级的、高性能的Web服务器,也可以用作反向代理服务器、负载均衡器等。它具有高并发处理能力、低内存消耗以及高度可配置性的特点。而HTTP-FLV是一种基于HTTP协议的流媒体传输协议,可以用于实时视频直播和点播。 nginx-http-flv-win32是NGINX在Windows平台下的一个特殊构建版本。它在原始的NGINX基础上,添加了对HTTP-FLV协议的支持。这就意味着可以使用它来搭建一个能够支持HTTP-FLV协议的流媒体服务器。 通过使用nginx-http-flv-win32,开发者可以借助NGINX的高性能和稳定性,快速搭建一个用于实时视频直播或点播的流媒体服务器。它可以接收来自客户端的HTTP-FLV请求,然后将视频数据传输到客户端。 此外,nginx-http-flv-win32还支持一些其他功能,例如断点续传、动态模块加载等。开发者可以根据自己的需求进行配置和扩展,以满足特定的业务要求。 总之,nginx-http-flv-win32是一个运行在Windows平台上的特定版本NGINX,用于支持HTTP-FLV协议的流媒体传输。它具有高性能、稳定性和高度可配置性的特点,可以助开发者快速搭建流媒体服务器,并实现实时视频直播和点播的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值