android 底部滑动效果怎么做,Android实现简单底部导航栏 Android仿微信滑动切换效果...
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仿微信滑动切换效果...相关推荐
- android 表情键盘切换,Android仿微信键盘切换效果
Android 仿微信的键盘切换(录音,表情,文字,其他),IM通讯,类似朋友圈只要涉及到文字等相关的app都会要涉及到键盘的处理,今天就给大家分享一下Android 仿微信的键盘切换. 效果图如下: ...
- Android studio实现底部导航,AndroidStudio制作底部导航栏以及用Fragment实现切换功能...
前言 大家好,我是 Vic,今天给大家带来AndroidStudio制作底部导航栏以及用Fragment实现切换功能的概述,希望你们喜欢 学习目标 AndroidStudio制作底部导航栏以及用Fra ...
- php仿微信底部菜单,Android实现简单底部导航栏 Android仿微信滑动切换效果
Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏 ...
- android仿微信的activity平滑水平切换动画,Android实现简单底部导航栏 Android仿微信滑动切换效果...
Android实现简单底部导航栏 Android仿微信滑动切换效果 发布时间:2020-10-09 19:48:00 来源:脚本之家 阅读:96 作者:丶白泽 Android仿微信滑动切换最终实现效果 ...
- android滑动菜单图标,Android实现简单底部导航栏 Android仿微信滑动切换效果
Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏 ...
- 【Android视图效果】共享元素实现仿微信查看大图效果
在之前的文章中,我们通过动画实现了这个,具体可以查看[Android 动画]动画详解之仿微信查看大图效果(四),这里,我们用过度动画来实现. 什么是共享元素? 它是Android 5.0新加入的一种过 ...
- 【Android 手势冲突】Colin带你彻底解决RecyclerView与ScrollView滑动冲突问题,并实现RecyclerView悬停导航栏(附demo哦)
在新一期的需求中,产品要求我们做出和美团某个页面类似的功能,即一个页面包含在scrollView中,上面一个部分放置一些常用的广告banner.宫格tab等,下面放置一个RecyclerView用于展 ...
- Android仿微信头像放大效果
android仿微信头像放大效果,使用Dialog+Gallery 实现 1. dialog显示时的动画style,动画可以自己根据喜好自己设置,此处动画xml省略 <style name=& ...
- Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)
本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/act ...
最新文章
- python【蓝桥杯vip练习题库】ADV-99栅格打印问题
- 【django】路由命名和路由反向解析
- 苹果a10处理器_iPhone运行安卓系统卡成翔,苹果A系处理器彻底跌落神坛!
- 学Web前端要用哪些工具?学成后薪资如何?
- Java Scala 混合编程导致 编译失败 ,【找不到符号】问题解决
- C++:函数指针是个什么玩意儿?
- 打印异常堆栈_通过异常堆栈丢失谈即时编译优化
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_12-页面静态化-页面静态化流程...
- python自建模块_python导入自建模块的问题
- 用冰点文库下载百度文库里面的内容
- 大数据毕设/课设 - 基于大数据的客流量数据可视化平台
- 微信小程序选择图片更换背景
- ROS重大功能,无线WISP和桥接
- 澳门上葡京综合度假村冬季献礼迎佳节
- 挂代理后git依然无法XXX
- python 神经网络预测未来30天数据_使用LSTM循环神经网络的时间序列预测实例:预测未来的货币汇率...
- 《黑马》——C++基础入门
- 占豪--2010年的市场机会在哪里(兼谈股指期货与楼市)
- 多线程面试题(高薪高频)
- 利用turtle库绘制五角星(以及填充)
热门文章
- ubuntu 16.0安装ros-kinetic
- 深度干货|云原生分布式数据库 PolarDB-X 的技术演进
- Scheduled SQL: SLS 大规模日志上的全局分析与调度
- 对话阿里敏捷教练 | 成功辅导过淘宝、闲鱼,他都是如何帮助团队
- Andrew Ng教你如何引领公司进入AI时代
- 阿里程序员工作小技巧 | 理解CPU分支预测,提高代码效率
- Kubernetes Ingress 高可靠部署最佳实践
- 深根固柢 云起磐石——移动云大云磐石服务器重磅推出
- 云+X案例展 | 传播类:九州云 SD-WAN 携手上海电信,助力政企客户网络重构 换新颜
- python 判断是否有余数_判断多个坐标是否在同一条直线上|Python练习系列[13]