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

yizhihongxing

一、介绍

在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日

相关文章

  • C++可视化角色按键移动控制的实现

    C++可视化角色按键移动控制的实现攻略 简介 本攻略将详细讲解如何使用C++实现一个可视化角色按键移动控制的功能。我们将使用一个简单的图形库来创建一个窗口,并通过键盘事件来控制角色的移动。 步骤 步骤一:选择图形库 首先,我们需要选择一个适合的图形库来创建窗口并处理键盘事件。在C++中,有很多选择,例如SFML、SDL和OpenGL等。在本攻略中,我们将使用…

    other 2023年7月29日
    00
  • .NET Framework在哪查看版本?.NET Framework查看版本技巧

    .NET Framework版本查看攻略 1. 使用命令提示符(Command Prompt) 通过命令提示符可以快速查看已安装的.NET Framework版本。以下是具体步骤: 打开命令提示符。你可以在开始菜单中搜索\”命令提示符\”,然后点击打开。 在命令提示符窗口中,输入以下命令并按下回车键: reg query \”HKEY_LOCAL_MACHI…

    other 2023年8月3日
    00
  • NFS(网络文件系统)服务器简单解析

    NFS(网络文件系统)服务器简单解析 NFS即网络文件系统,是一种分布式文件系统,它允许在网络上通过服务器和客户端来分享文件。本文将介绍NFS服务器的简单配置,并提供两个示例说明。 1. 安装NFS服务器 在Linux系统中,安装NFS服务器和客户端通常非常简单。以Ubuntu为例,执行以下命令即可安装NFS服务器: sudo apt-get update …

    other 2023年6月27日
    00
  • 软件工程第二次作业——git的使用

    Git是一款分布式版本控制系统,可以帮助开发者管理代码的版本和变更。下面是Git的使用攻略,包括安装、配置和常用命令等。 安装Git 在Linux系统中,可以使用以下命令安装Git: sudo apt-get update sudo apt-get install git 在Windows系统中,可以从Git官网(https://git-scm.com/do…

    other 2023年5月5日
    00
  • 关于java:正则表达式匹配数字 逗号和分号?

    Java正则表达式匹配数字、逗号和分号 在Java中,正则表达式是一种强大的工具,可以用于匹配和操作字符串。如果您需要匹配数字、逗号和分号,使用正则表达式来实现。在本攻略中,我们将介绍如何使用Java正表达式来匹配数字、逗号和分号。 匹配数字、逗号和分号 要匹数字、逗号和分号,可以使用正则表达式中的字符类。字符类用方括号[]括起来,其中包含要匹配的字符。下面…

    other 2023年5月9日
    00
  • 笔记本内存种类有哪些 笔记本常见内存类型介绍

    笔记本内存种类 笔记本内存是指用于存储和访问数据的计算机内部组件。常见的笔记本内存类型包括: DDR3内存:DDR3(Double Data Rate 3)是一种常见的内存类型,它在速度和功耗方面相对较低。DDR3内存模块通常具有240个引脚,并且在频率方面可以达到1600 MHz。这种内存类型在早期笔记本电脑中非常常见。 DDR4内存:DDR4(Doubl…

    other 2023年8月1日
    00
  • SQL语句(二)创建带主键和约束的数据表

    SQL语句(二)创建带主键和约束的数据表 在之前的SQL语句(一)文章中,我们介绍了如何使用SQL语言创建一个最简单的数据表。在本文中,我们将介绍如何创建一个带主键和约束的数据表。 什么是主键 首先,让我们来了解一下什么是主键。主键是一列或一组列,用来标识表中的唯一记录。主键是区分每个记录的唯一标识符。如果一个表没有主键,那么该表被称为没有主键的表。 创建带…

    其他 2023年3月28日
    00
  • web可视化开发工具 App Builder 2019安装注册激活教程(含下载)

    Web可视化开发工具App Builder 2019安装注册激活教程 下载App Builder 2019 首先,我们需要下载App Builder 2019的安装包。可以在App Builder官方网站下载:https://www.davidesperalta.com/appbuilder 安装App Builder 2019 双击刚才下载好的安装包,进入…

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