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仿微信滑动切换效果...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS – OpenGL ES 调节图像
- 下一篇: qt使用自带的日志输出实例输出日志时,在