Android仿今日头条滑动页面导航效果

一、介绍

在Android开发中,实现滑动页面导航效果是比较常见的需求之一。本文针对如何实现仿今日头条的页面滑动导航效果进行详细讲解。

二、实现步骤

1.在布局文件中定义ViewPager和TabLayout控件,用于展示滑动页面和导航栏;

2.在Java代码中定义FragmentPagerAdapter,ViewPager的适配器;通过适配器承载Fragment实现滑动页面的展示;

3.在Java代码中设置TabLayout与ViewPager关联,实现滑动页面导航的效果;

4.通过自定义View为TabLayout设置下划线并提供属性接口,实现滑动条的效果。

三、示例说明

1.布局文件

在布局文件中,需要定义ViewPager和TabLayout两个控件。其中ViewPager用于展示滑动页面,而TabLayout用于展示导航栏。示例代码如下:

<android.support.design.widget.TabLayout
    android:id="@+id/tab_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabGravity="center"
    app:tabMode="fixed"
    app:tabSelectedTextColor="#000000"
    app:tabTextColor="#666666" />

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

2.Java代码

在Java代码中,需要定义FragmentPagerAdapter适配器,并在TabLayout中与ViewPager关联。同时,为了实现滑动条的效果,需要定义一个自定义View继承自View并实现onDraw方法,用于绘制TabLayout下方的滑动条。示例代码如下:

public class MainActivity extends AppCompatActivity {

    private TabLayout mTabLayout;
    private ViewPager mViewPager;

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

        mTabLayout = findViewById(R.id.tab_layout);
        mViewPager = findViewById(R.id.view_pager);

        FragmentPagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {

            private String[] mTitles = {"推荐", "热点", "视频", "社会", "娱乐", "科技", "汽车", "体育"};

            @Override
            public Fragment getItem(int position) {
                return PlaceholderFragment.newInstance(position);
            }

            @Override
            public int getCount() {
                return mTitles.length;
            }

            @Override
            public CharSequence getPageTitle(int position) {
                return mTitles[position];
            }
        };

        mViewPager.setAdapter(adapter);
        mTabLayout.setupWithViewPager(mViewPager);
        mTabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.colorAccent));
        mTabLayout.post(() -> {
            int width = mTabLayout.getWidth() / mViewPager.getAdapter().getCount();
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
            int screenW = metrics.widthPixels;
            int tabWidth = width + mTabLayout.getTabSelectedIndicator().getIntrinsicWidth();
            int marginLeft = (screenW / mViewPager.getAdapter().getCount() - tabWidth) / 2;
            mTabLayout.setPadding(marginLeft, mTabLayout.getPaddingTop(), marginLeft, mTabLayout.getPaddingBottom());
        });
        mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                mTabLayout.scroll(position, positionOffset);
            }
        });
        mViewPager.setCurrentItem(0);
    }
}

public class TabLayoutIndicatorView extends View {

    private Paint mPaint;
    private int mIndicatorColor;
    private int mIndicatorHeight;
    private float mIndicatorCenterX = 0;
    private float mIndicatorPullOutDistance = 0;

    public TabLayoutIndicatorView(Context context) {
        this(context, null);
    }

    public TabLayoutIndicatorView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TabLayoutIndicatorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mIndicatorColor = Color.BLACK;
        mIndicatorHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics());
    }

    public void setIndicatorColor(int color) {
        mIndicatorColor = color;
    }

    public void setIndicatorHeight(int height) {
        mIndicatorHeight = height;
    }

    public void setIndicatorPosition(float center, float pullOut) {
        mIndicatorCenterX = center;
        mIndicatorPullOutDistance = pullOut;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPaint.setColor(mIndicatorColor);
        canvas.drawRect(
                mIndicatorCenterX - mIndicatorPullOutDistance,
                getHeight() - mIndicatorHeight,
                mIndicatorCenterX + mIndicatorPullOutDistance,
                getHeight(),
                mPaint);
    }
}

四、总结

通过以上步骤,我们可以实现仿今日头条的滑动页面导航效果。其中,在Java代码中需要注意ViewPager及TabLayout的适配和关联,以及自定义View的使用,这是实现该效果的关键。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android仿今日头条滑动页面导航效果 - Python技术站

(0)
上一篇 2023年6月20日
下一篇 2023年6月20日

相关文章

  • 百度蜘蛛是抓取网站和提高抓取频率的技巧分享

    下面我来详细讲解一下“百度蜘蛛是抓取网站和提高抓取频率的技巧分享”的完整攻略。 什么是百度蜘蛛? 百度蜘蛛是百度搜索引擎的爬虫程序,也叫做Baidu Spider(以下简称“蜘蛛”)。蜘蛛按照一定的规则和算法,自动地访问网页、收集网页内容和链接,进而生成网页索引并提供给用户搜索结果。 如何让百度蜘蛛更好地抓取网站? 1. 提高网站的可访问性 蜘蛛需要能够访问…

    other 2023年6月27日
    00
  • Linux(CentOS)常用操作指令(一)

    Linux(CentOS)常用操作指令(一) Introduction 在使用Linux(CentOS)操作系统时,我们经常需要使用到一些常用的指令,本篇文章将会介绍一些基础的操作指令,以供大家参考。 Command list 以下是一些常用的Linux(CentOS)操作指令: 1. cd cd指令是切换当前目录的命令。比如我们要进入”/home”目录,只…

    其他 2023年3月28日
    00
  • 数据库io简介

    数据库IO简介 什么是数据库IO 数据库IO是数据库管理系统中的一个重要概念,是指数据对磁盘的输入输出操作,包括硬盘读写操作和内存缓存操作。数据库的性能优化主要集中在IO操作的优化上,以提高数据库性能。 为什么IO操作很重要 数据库IO操作花费的时间和系统资源非常大,因此IO操作的性能对系统整体性能有很大影响。一般来说,IO操作的性能瓶颈主要在于磁盘读写速度…

    其他 2023年3月29日
    00
  • java不通过配置文件初始化logger示例

    初始化Logger是Java程序中常见的操作之一,一般是用配置文件的方式来实现。但是,有时候我们不想使用配置文件的方式来初始化Logger,而是想通过代码来进行初始化。下面是两条示例说明来详细讲解如何不通过配置文件初始化Logger。 示例一:使用代码初始化rootLogger rootLogger是Logger hierarchy中的最高级别的Logger…

    other 2023年6月20日
    00
  • 微信小程序list列表

    微信小程序list列表 微信小程序是一款高效率、易上手的小程序开发平台。在小程序中,我们常常需要展示各种信息,其中最常用的就是list列表。list列表是小程序中的一个基本组件,它可以高效地展示一系列信息,并且支持各种交互事件。 在本文中,我们将详细介绍如何使用微信小程序的list列表组件,并提供一些实用的技巧和细节。 基本使用 首先,我们需要知道如何在小程…

    其他 2023年3月28日
    00
  • 路由器常见内存容量说识别

    路由器常见内存容量识别攻略 路由器常见内存容量识别是一项重要的技能,它可以帮助我们了解路由器的性能和适用场景。下面是一个详细的攻略,帮助你识别路由器的常见内存容量。 步骤一:查找路由器型号 首先,我们需要查找路由器的型号。通常,型号信息可以在路由器的外壳上或者设备的背面找到。型号信息通常以字母和数字的组合形式呈现,例如\”RT-AC68U\”。 步骤二:查找…

    other 2023年8月1日
    00
  • 详解ZABBIX监控ESXI主机的问题

    详解Zabbix监控ESXi主机的问题 如果您需要使用Zabbix监控ESXi主机,您需要执行以下步骤: 第一步:配置ESXi主机 启用ESXi主机的SSH服务在ESXi主机上打开“配置”选项,找到“安全配置”,开启SSH服务。 安装Zabbix代理在ESXi主机上安装Zabbix代理。你可以从 Zabbix官网 下载安装包,然后通过SSH登录并使用以下命令…

    other 2023年6月27日
    00
  • 如何解决uc服务端地址无效的问题

    当出现UC服务端地址无效的问题时,可以考虑以下几种解决方案。 解决方案1:检查UC服务端地址是否正确 首先,需要检查UC服务端地址是否正确。在设置UC客户端时,需要将服务端地址(即UC服务器IP或域名)正确地填写到配置文件或UC客户端中。如果配置错误,UC客户端将无法连接到UC服务器,并显示“UC服务端地址无效”的错误信息。 以下示例说明如何检查UC服务端地…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部