Android实现简单底部导航栏 Android仿微信滑动切换效果

发布时间:2020-10-09 19:48:00

来源:脚本之家

阅读:96

作者:丶白泽

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仿微信的activity平滑水平切换动画,Android实现简单底部导航栏 Android仿微信滑动切换效果...相关推荐

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

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

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

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

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

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

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

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

  5. JFTabBar android强大的底部导航栏框架 (微信底部导航栏效果)

    TabBar这个名字相信很多学过一点IOS程序员都知道它是用来干嘛的,但本人也并非擅长开发IOS程序员,只是略懂略懂....这是一个很强大的TabBar,可满足很多需求.用起来也非常简单,在oncre ...

  6. Andriod底部导航栏图片和文字的切换

    在App开发中底部导航栏的应用还是很多的,有时我们需要到底部导航既有图标又有文字,这就要求在点击切换时,未选中的其他图标及相应文字变换成另一种颜色,选中的又是一种颜色,要保证图片和文字的同时改变. 看 ...

  7. 解决手机端微信公众号内input输入框获取焦点后,底部导航栏显示在输入法软键盘上面的问题

    今天遇到在微信公众号中打开网站,input 输入框和textarea输入框获取焦点后,弹出输入法键盘,将底部的导航栏"顶到"输入法键盘上面的问题,看着非常shit! 直接上代码看效 ...

  8. android仿微信的activity平滑水平切换动画,Android实现平滑翻动效果

    本文实例为大家分享了Android实现平滑翻动效果的具体代码,供大家参考,具体内容如下 效果 1.activity加implements implements GestureDetector.OnGe ...

  9. android仿微信的activity平滑水平切换动画,android仿微信的activity平滑水平切换动画...

    大家好,下面我们来探讨一下微信界面跳转的动画,简单,大方,不失华丽:overridePendingTransition(android.R.anim.slide_in_left,android.R.a ...

最新文章

  1. Redis初学:8(Hash类型)
  2. 人工智能浪潮正席卷全球
  3. JDBC——入门知识【转】
  4. 滴滴开源Android插件化框架VirtualAPK原理分析
  5. sort函数用于vector向量的排序
  6. devexpress TreeList递归及点击获取数据
  7. python语言特点多模型_利用CRF模型进行文本分类完整教程(Python语言)
  8. Verilog——hdb3编译码的层次化设计与实现
  9. ZEMAX | 使用 Project Directory 组织 OpticStudio文件
  10. linux安装pyodbc模块,Linux下安装pyodbc报错 error: command 'gcc' failed with exit status 1
  11. 球面投影 (立体和柱面的投影效果)
  12. 黑客+马拉松=? 黑客马拉松?
  13. 【Driver Booster 9 PRO】 驱动更新工具 提升游戏性能
  14. 怎样更改计算机应用图标,win7如何更改软件图标_win7修改应用程序图标的教程
  15. ES集群安装错误记录
  16. linux默认端口范围是多少?
  17. 网络推广50种方法必看
  18. 成本(CPU Costing)的含义
  19. Python识别垃圾邮件
  20. 魅蓝2 android os,魅蓝note2的原生android系统刷机包

热门文章

  1. Docker的镜像导出与导入与拷贝
  2. windbg拦截驱动
  3. 为学Android,我看了这些书
  4. C语言--字符串和数字的相互转换
  5. 对Linux0.11 中 进程0 和 进程1分析
  6. Linux内核源码中使用宏定义的若干技巧
  7. 红黑树:自平衡的二叉查找树
  8. 基于 linux 平台的 libpcap 源代码分析
  9. matlab的边缘检测方法,MATLAB应用—Matlab多种图像边缘检测方法
  10. 升级oracle spu,Oracle 2017改变:新补丁更新(RU和RUR),新的版本(Release 18和19)