android 底部滑动效果怎么做,Android实现简单底部导航栏 Android仿微信滑动切换效果...

android仿微信滑动切换最终实现效果:

502470a181d6890fa9a7bf57ab2cc76f.gif

大体思路:

1. 主要使用两个自定义view配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标;

2. 底部导航栏的设置方法类似于tablayout的关联,view需要创建关联方法,用来关联viewpager;

3. 通过关联方法获取viewpager实例后,根据viewpager页面数创建底部导航栏的图标按钮;

代码实现:

1. 新建第一个自定义view, 图标 + 文字 的底部按钮;

/**

* 自定义控件,该控件为底部导航栏中的图标

* created by mrzheng on 2017/8/2.

*/

public class tabview extends linearlayout {

botbean mbean;

private textview title;

private imageview iconimage;

/**

* 引用此控件,只能通过new 方法;接收一个tabview

* @param context

*/

public tabview(context context, botbean bean) {

super(context);

this.mbean = bean;

initview();

}

/**

* 初始化布局

*/

public void initview() {

setorientation(vertical);

setgravity(gravity.center);

//添加小图标

iconimage = new imageview(getcontext());

linearlayout.layoutparams layoutparams = new linearlayout.layoutparams(viewgroup.layoutparams.wrap_content

, viewgroup.layoutparams.wrap_content);

iconimage.setlayoutparams(layoutparams);

iconimage.setimageresource(mbean.getuncheckedid());

drawable drawable = getcontext().getresources().getdrawable(mbean.getuncheckedid());

drawable wrapdrawable = drawablecompat.wrap(drawable);

drawablecompat.settintlist(wrapdrawable, colorstatelist.valueof(color.black));

iconimage.setimagedrawable(wrapdrawable);

addview(iconimage);

//标题

title = new textview(getcontext());

linearlayout.layoutparams titleparams = new layoutparams(layoutparams.wrap_content,

layoutparams.wrap_content);

title.setlayoutparams(titleparams);

title.settext(mbean.getcontent());

addview(title);

}

//判断选择状态,改变图标

//供外部调用

public void setselected(boolean isselected) {

if (mbean == null) {

return;

}

if (isselected) {

if (iconimage != null) {

//使用颜色过滤器,改变选中时的颜色

drawable drawable = getcontext().getresources().getdrawable(mbean.getuncheckedid());

drawable wrapdrawable = drawablecompat.wrap(drawable);

drawablecompat.settintlist(wrapdrawable, colorstatelist.valueof(color.green));

iconimage.setimagedrawable(wrapdrawable);

title.settextcolor(color.green);

}

} else {

if (title != null) {

// iconimage.setimageresource(mbean.getuncheckedid());

drawable drawable = getcontext().getresources().getdrawable(mbean.getuncheckedid());

drawable wrapdrawable = drawablecompat.wrap(drawable);

drawablecompat.settintlist(wrapdrawable, colorstatelist.valueof(color.black));

iconimage.setimagedrawable(wrapdrawable);

title.settextcolor(color.gray);

}

}

}

}

2. 创建第二个自定义view,该view为底部导航栏载体,根据 关联的viewpager页面 个数创建 底部导航栏图标;

/**

* 该控件为底部导航栏图标载体

* created by mrzheng on 2017/8/2.

*/

public class bottomview extends linearlayout {

private viewpager vp;

bottompagechangelistener mbottompagechangelistener;

public bottomview(context context) {

super(context);

}

public bottomview(context context, @nullable attributeset attrs) {

super(context, attrs);

}

public bottomview(context context, @nullable attributeset attrs, int defstyleattr) {

super(context, attrs, defstyleattr);

}

/**

* 同tablayout用法相似,需要与viewpager进行绑定

*/

public void setviewpager(viewpager viewpager, arraylist botbeen,bottompagechangelistener bottompagechangelistener) {

if (viewpager == null) {

return;

}

vp = viewpager;

mbottompagechangelistener = bottompagechangelistener;

inittabview(botbeen);

//设置viewpager的点击事件

vp.addonpagechangelistener(new viewpager.simpleonpagechangelistener(){

@override

public void onpageselected(int position) {

for (int i = 0; i < getchildcount(); i++) {

getchildat(i).setselected((position == i ? true : false));

}

if (mbottompagechangelistener != null) {

mbottompagechangelistener.onpagechangelistener(position);

}

}

});

}

/**

* 初始化底部导航栏,viewpager有多少页,就创建多少个图标

*/

public void inittabview(arraylist botbeen) {

setgravity(horizontal);

for (int i = 0; i < botbeen.size(); i++) {

botbean bean = botbeen.get(i);

tabview tabview = new tabview(getcontext(), bean);

linearlayout.layoutparams params = new linearlayout.layoutparams(viewgroup.layoutparams.wrap_content

, viewgroup.layoutparams.wrap_content);

params.weight = 1;

params.gravity = gravity.center;

tabview.setlayoutparams(params);

//为每个view设置点击事件,点击跳转过去

final int finali = i;

tabview.setonclicklistener(new onclicklistener() {

@override

public void onclick(view view) {

vp.setcurrentitem(finali);

}

});

//设置一开始选中状态

if (i == 0) {

tabview.setselected(true);

//由于初始化时,onpageselected()选中方法并没有的到执行,所以主动去调用回调方法

if (mbottompagechangelistener != null) {

mbottompagechangelistener.onpagechangelistener(i);

}

}

addview(tabview);

}

}

/**

* 提供接口回调方法,每次滑动都通知外界

*/

public interface bottompagechangelistener{

void onpagechangelistener(int position);

}

}

3. 添加 图标自定义类, 该类封装着底部导航栏中每一个选项的的图标和文字,将该类型对象添加到集合中,用于给底部导航栏设置图标;

/**

* 底部导航栏的封装类,该类对象用于在底部导航栏添加对应图标和文字

* created by mrzheng on 2017/8/2.

*/

public class botbean {

string content;//图标名字

int uncheckedid;//未选中时的图标

public botbean(string content, int uncheckedid) {

this.content = content;

this.uncheckedid = uncheckedid;

}

public string getcontent() {

return content;

}

public void setcontent(string content) {

this.content = content;

}

public int getuncheckedid() {

return uncheckedid;

}

public void setuncheckedid(int uncheckedid) {

this.uncheckedid = uncheckedid;

}

}

自定义view实现完成,在fragment或activity中使用该view:

1. 在布局文件中添加:

android:id="@+id/bottom"

android:layout_width="match_parent"

android:layout_height="60dp">

2. 在活动或碎片中添加:

public class mainactivity extends appcompatactivity {

arraylist mfragments;

arraylist mitemicon;//存放底部图标和文字

private textview tv;

@override

protected void oncreate(bundle savedinstancestate) {

super.oncreate(savedinstancestate);

setcontentview(r.layout.activity_main);

mfragments = new arraylist<>();

mitemicon = new arraylist<>();

mfragments.add(new textfragment());

mfragments.add(new textfragment());

mfragments.add(new textfragment());

mfragments.add(new textfragment());

mitemicon.add(new botbean("首页", r.mipmap.ic_home2));

mitemicon.add(new botbean("通讯录", r.mipmap.ic_study2));

mitemicon.add(new botbean("发现", r.mipmap.ic_found2));

mitemicon.add(new botbean("我的", r.mipmap.ic_me2));

viewpager vp = (viewpager) findviewbyid(r.id.vp);

vp.setadapter(new fadapter(getsupportfragmentmanager()));

tv = (textview) findviewbyid(r.id.tv);

bottomview bottom = (bottomview) findviewbyid(r.id.bottom);

bottom.setviewpager(vp, mitemicon, new bottomview.bottompagechangelistener() {

@override

public void onpagechangelistener(int position) {

//滑动后的回调

tv.settext(mitemicon.get(position).getcontent());

}

});

}

/**

* 适配器

*/

class fadapter extends fragmentpageradapter {

public fadapter(fragmentmanager fm) {

super(fm);

}

@override

public fragment getitem(int position) {

return mfragments.get(position);

}

@override

public int getcount() {

return mfragments.size();

}

}

}

总结:该代码耦合度较高,有些代码可能不太合理;欢迎大牛们给出合理建议;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cgi进程设置多少 宝塔_宝塔面板安装完的一些列操作

推荐教程虚拟机建站总目录 - 辉哥博客​www.haah.net前言新安装的宝塔会有很多地方需要配置&#xff0c;如果懂的大佬可以跳过&#xff0c;如果是小白可以按照辉哥的教程一步步操作&#xff0c;辉哥是以虚拟机进行操作的&#xff0c;但是服务器也是一样的道理&#xff01;安全入…

白话中台战略:中台是个什么鬼?

戳蓝字“CSDN云计算”关注我们哦&#xff01;来源&#xff1a;健荐作者&#xff1a;王健从去年开始&#xff0c;好像就有一只无形的手一直将我与“微服务”、“平台化”、“中台化”撮合在一起&#xff0c;给我带来了很多的困扰和思考与收获。故事的开始源于去年的技术雷达峰会…

用WEB技术栈开发NATIVE应用(二):WEEX 前端SDK原理详解

摘要&#xff1a; WEEX依旧采取传统的web开发技术栈进行开发&#xff0c;同时app在终端的运行体验不输native app。其同时解决了开发效率、发版速度以及用户体验三个核心问题。那么WEEX是如何实现的&#xff1f;目前WEEX已经完全开源&#xff0c;并捐给Apache基金会&#xff0c…

cad查看_CAD与天正软件对齐命令实例讲解

好课推荐&#xff1a;1、CAD2014&#xff1a;点击查看 2、室内&全屋&#xff1a;点击查看 3、CAD2019&#xff1a;点击查看4、CAD2018&#xff1a;点击查看5、Bim教程&#xff1a;点击查看 6、室内手绘&#xff1a;点击查看7、CAD三维&#xff1a;点击查看8、全屋定制&…

Storm精华问答 | storm与Hadoop区别?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Apache Storm是一个分布式实时大数据处理系统。Storm设计用于在容错和水平可扩展方法中处理大量数据。它是一个流数据框架&#xff0c;具有最高的摄取率。今天&#xff0c;我们就挑一些Storm的安装配置问题来看看吧。1Q&#xff1a;…

weex 在 iOS 上如何实现常见的网络缓存

摘要&#xff1a;weex 旨在兼顾web动态性与native的用户体验&#xff0c;如果想将两者的优势最大化&#xff0c;那么缓存就显得格外重要&#xff0c;本文介绍如何利用缓存&#xff0c;实现weex页面迅速打开&#xff0c;甚至“秒开”的效果。点此查看原文&#xff1a;http://cli…

python实现多智能体一致性_促进产学研,多智能体协同控制——科研与实践教学齐飞...

对多智能体感兴趣欢迎Wangzaixiaolatiao&#xff08;VX&#xff09;沟通。一、引言1.1、概述多智能体协同控制系统即多个智能体组成的集合&#xff0c;它的目标是将大而复杂的系统集成设成小的、彼此互相通信和协调的、易于管理的系统。多智能体协同控制系统在表达实际系统时&a…

android 汇编 参数,安卓ARM汇编基础知识

ARM 是 Advanced RISC Machine 的缩写&#xff0c;可以理解为一种处理器的架构&#xff0c;还可以将它作为一套完整的处理器指令集。RISC(Reduced Instruction Set Computing) 精简指令集计算机&#xff1a;一种执行较少类型计算机指令的微处理器。处理器指令集: 计算机处理命令…

移动推送消息送达常见问题与解决办法

摘要&#xff1a; 一、 收到重复的推送内容 * 收到重复的推送内容&#xff0c;排除了业务自身的推送逻辑之外&#xff0c;重点介绍一下部分机型多渠道推送可能带来的重复推送问题。 * 对于Android系统&#xff0c;对于设备已经在某些三方系统中注册过&#xff0c;并且通过该三方…

帮助你驾驭 Kubernetes 的 4 个工具 | Linux 中国

学习如何驾驭 Kubernetes 比如何建造它更重要&#xff0c;这些工具可以帮助你更快上路。-- Scott Mccarty译者|Xinyu Wang来源|Linux中国在本系列的第三篇文章中&#xff0c;Kubernetes 基础&#xff1a;首先学习如何使用&#xff0c;我强调你应该学会使用 Kubernetes&#xff…

三大新功能发布 阿里云短视频SDK玩法多 优惠更多

摘要&#xff1a; 近日&#xff0c;阿里云短视频SDK进行了重大升级&#xff0c;对视频滤镜和视频特效方面进行了功能更新&#xff0c;助力用户快速接入带来更多的玩法。 短视频SDK介绍 短视频SDK提供短视频录制、导入和编辑的高级功能&#xff0c;支持多种分辨率选择、实时美颜…

html asp 日历_全球第一本《2021世界艺术日历》,正式发售!

原标题&#xff1a;全球第一本《2021世界艺术日历》&#xff0c;正式发售&#xff01;艺术&#xff0c;人类精神文明的美丽结晶。作为一名资深艺术爱好者&#xff0c;多希望 每天都能和名画为伴&#xff0c;接受各个时期艺术佳作的熏陶。 记得2020年的开头&#xff0c; 我买了好…

三星计划替换所有日产半导体材料;美企过度响应“禁令”,华为被曝祭出数亿索赔;苹果iPhone 11发布日期刚刚泄露...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

button hover逐渐变色_两当水库界桩@产品长久不变色 - 两当安全防护

河北合诺电力设备有限公司成立于2009年&#xff0c;位于河北省石家庄市新华区&#xff0c;是一家富有高科技生产力与完善服务体系的综合性企业。公司集科研、生产、销售及服务于一体&#xff0c;厂区占地50余亩&#xff0c;现有员工135人&#xff0c;专业资质技术人员26人&…

I+关系网络分析发布,提供完整的可视化分析和关系引擎功能

摘要&#xff1a; I关系网络分析是以OLP模型为核心&#xff0c;面向业务快速建模&#xff0c;为开发者和终端用户提供大数据关系计算引擎&#xff08;含API服务&#xff09;和可视化交互分析能力&#xff0c;面向安防、关税、银行、保险、互联网等提供的产品化方案。目前&#…

赞,全网开发者都在学的 26 门 AI 课程!

整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;免费的在线学习课程一直是大多数人学习 AI 知识和技能的方式之一。今天&#xff0c;基于 Github 上一位小姐姐 Chip Huyen 分享的 10 门机器学习课程&#xff0c;AI科技大本营将这份收藏大礼包进…

结构损伤检测与智能诊断 陈长征_宿迁厂房安全检测多少钱介绍说明

检测与鉴定1. 混凝土类材料(混凝土试块和混凝土芯样抗压强度、砂浆试块抗压强度)试验&#xff1b;2. 钢筋及接头(钢筋原材和焊接接头、钢筋后锚固件)力学工艺性能试验&#xff1b;3. 混凝土结构检测混凝土预制构件结构性能检测、钻芯法检测混凝土强度、混凝土回弹法检测强度、钢…

阿里云ECS开放批量创建实例接口,实现弹性资源的创建

摘要&#xff1a;为了更方便的实现弹性的资源创建&#xff0c;方便用户一次运行多台ECS按量实例来完成应用的开发和部署&#xff0c;阿里云开放了ECS的批量创建实例接口RunInstances&#xff0c;可以单次最多创建100台实例&#xff0c;避免重复调用和创建。点此查看原文&#x…

项目是如何死掉的?太过真实!

戳蓝字“CSDN云计算”关注我们哦&#xff01;做项目多年&#xff0c;见过成功的项目&#xff0c;也见过太多失败的项目&#xff1b;成功或失败&#xff0c;都是项目的宿命。我总结了项目失败的几点要素&#xff0c;供有志于将项目做失败的同学参考。绝大多数人在面对失败的可能…