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

大体思路:

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();

}

}

}

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

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

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

  1. android 表情键盘切换,Android仿微信键盘切换效果

    Android 仿微信的键盘切换(录音,表情,文字,其他),IM通讯,类似朋友圈只要涉及到文字等相关的app都会要涉及到键盘的处理,今天就给大家分享一下Android 仿微信的键盘切换. 效果图如下: ...

  2. Android studio实现底部导航,AndroidStudio制作底部导航栏以及用Fragment实现切换功能...

    前言 大家好,我是 Vic,今天给大家带来AndroidStudio制作底部导航栏以及用Fragment实现切换功能的概述,希望你们喜欢 学习目标 AndroidStudio制作底部导航栏以及用Fra ...

  3. php仿微信底部菜单,Android实现简单底部导航栏 Android仿微信滑动切换效果

    Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏 ...

  4. android仿微信的activity平滑水平切换动画,Android实现简单底部导航栏 Android仿微信滑动切换效果...

    Android实现简单底部导航栏 Android仿微信滑动切换效果 发布时间:2020-10-09 19:48:00 来源:脚本之家 阅读:96 作者:丶白泽 Android仿微信滑动切换最终实现效果 ...

  5. android滑动菜单图标,Android实现简单底部导航栏 Android仿微信滑动切换效果

    Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏 ...

  6. 【Android视图效果】共享元素实现仿微信查看大图效果

    在之前的文章中,我们通过动画实现了这个,具体可以查看[Android 动画]动画详解之仿微信查看大图效果(四),这里,我们用过度动画来实现. 什么是共享元素? 它是Android 5.0新加入的一种过 ...

  7. 【Android 手势冲突】Colin带你彻底解决RecyclerView与ScrollView滑动冲突问题,并实现RecyclerView悬停导航栏(附demo哦)

    在新一期的需求中,产品要求我们做出和美团某个页面类似的功能,即一个页面包含在scrollView中,上面一个部分放置一些常用的广告banner.宫格tab等,下面放置一个RecyclerView用于展 ...

  8. Android仿微信头像放大效果

    android仿微信头像放大效果,使用Dialog+Gallery 实现 1.  dialog显示时的动画style,动画可以自己根据喜好自己设置,此处动画xml省略 <style name=& ...

  9. Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

    本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/act ...

最新文章

  1. python【蓝桥杯vip练习题库】ADV-99栅格打印问题
  2. 【django】路由命名和路由反向解析
  3. 苹果a10处理器_iPhone运行安卓系统卡成翔,苹果A系处理器彻底跌落神坛!
  4. 学Web前端要用哪些工具?学成后薪资如何?
  5. Java Scala 混合编程导致 编译失败 ,【找不到符号】问题解决
  6. C++:函数指针是个什么玩意儿?
  7. 打印异常堆栈_通过异常堆栈丢失谈即时编译优化
  8. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_12-页面静态化-页面静态化流程...
  9. python自建模块_python导入自建模块的问题
  10. 用冰点文库下载百度文库里面的内容
  11. 大数据毕设/课设 - 基于大数据的客流量数据可视化平台
  12. 微信小程序选择图片更换背景
  13. ROS重大功能,无线WISP和桥接
  14. 澳门上葡京综合度假村冬季献礼迎佳节
  15. 挂代理后git依然无法XXX
  16. python 神经网络预测未来30天数据_使用LSTM循环神经网络的时间序列预测实例:预测未来的货币汇率...
  17. 《黑马》——C++基础入门
  18. 占豪--2010年的市场机会在哪里(兼谈股指期货与楼市)
  19. 多线程面试题(高薪高频)
  20. 利用turtle库绘制五角星(以及填充)

热门文章

  1. ubuntu 16.0安装ros-kinetic
  2. 深度干货|云原生分布式数据库 PolarDB-X 的技术演进
  3. Scheduled SQL: SLS 大规模日志上的全局分析与调度
  4. 对话阿里敏捷教练 | 成功辅导过淘宝、闲鱼,他都是如何帮助团队
  5. Andrew Ng教你如何引领公司进入AI时代
  6. 阿里程序员工作小技巧 | 理解CPU分支预测,提高代码效率
  7. Kubernetes Ingress 高可靠部署最佳实践
  8. 深根固柢 云起磐石——移动云大云磐石服务器重磅推出
  9. 云+X案例展 | 传播类:九州云 SD-WAN 携手上海电信,助力政企客户网络重构 换新颜
  10. python 判断是否有余数_判断多个坐标是否在同一条直线上|Python练习系列[13]