android 底部滑动效果怎么做,Android实现简单底部导航栏 Android仿微信滑动切换效果...
android仿微信滑動(dòng)切換最終實(shí)現(xiàn)效果:
大體思路:
1. 主要使用兩個(gè)自定義view配合實(shí)現(xiàn); 底部圖標(biāo)加文字為一個(gè)自定義view,底部導(dǎo)航欄為一個(gè)載體,根據(jù)需要來(lái)添加底部圖標(biāo);
2. 底部導(dǎo)航欄的設(shè)置方法類似于tablayout的關(guān)聯(lián),view需要?jiǎng)?chuàng)建關(guān)聯(lián)方法,用來(lái)關(guān)聯(lián)viewpager;
3. 通過(guò)關(guān)聯(lián)方法獲取viewpager實(shí)例后,根據(jù)viewpager頁(yè)面數(shù)創(chuàng)建底部導(dǎo)航欄的圖標(biāo)按鈕;
代碼實(shí)現(xiàn):
1. 新建第一個(gè)自定義view, 圖標(biāo) + 文字 的底部按鈕;
/**
* 自定義控件,該控件為底部導(dǎo)航欄中的圖標(biāo)
* created by mrzheng on 2017/8/2.
*/
public class tabview extends linearlayout {
botbean mbean;
private textview title;
private imageview iconimage;
/**
* 引用此控件,只能通過(guò)new 方法;接收一個(gè)tabview
* @param context
*/
public tabview(context context, botbean bean) {
super(context);
this.mbean = bean;
initview();
}
/**
* 初始化布局
*/
public void initview() {
setorientation(vertical);
setgravity(gravity.center);
//添加小圖標(biāo)
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);
//標(biāo)題
title = new textview(getcontext());
linearlayout.layoutparams titleparams = new layoutparams(layoutparams.wrap_content,
layoutparams.wrap_content);
title.setlayoutparams(titleparams);
title.settext(mbean.getcontent());
addview(title);
}
//判斷選擇狀態(tài),改變圖標(biāo)
//供外部調(diào)用
public void setselected(boolean isselected) {
if (mbean == null) {
return;
}
if (isselected) {
if (iconimage != null) {
//使用顏色過(guò)濾器,改變選中時(shí)的顏色
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. 創(chuàng)建第二個(gè)自定義view,該view為底部導(dǎo)航欄載體,根據(jù) 關(guān)聯(lián)的viewpager頁(yè)面 個(gè)數(shù)創(chuàng)建 底部導(dǎo)航欄圖標(biāo);
/**
* 該控件為底部導(dǎo)航欄圖標(biāo)載體
* 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進(jìn)行綁定
*/
public void setviewpager(viewpager viewpager, arraylist botbeen,bottompagechangelistener bottompagechangelistener) {
if (viewpager == null) {
return;
}
vp = viewpager;
mbottompagechangelistener = bottompagechangelistener;
inittabview(botbeen);
//設(shè)置viewpager的點(diǎn)擊事件
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);
}
}
});
}
/**
* 初始化底部導(dǎo)航欄,viewpager有多少頁(yè),就創(chuàng)建多少個(gè)圖標(biāo)
*/
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);
//為每個(gè)view設(shè)置點(diǎn)擊事件,點(diǎn)擊跳轉(zhuǎn)過(guò)去
final int finali = i;
tabview.setonclicklistener(new onclicklistener() {
@override
public void onclick(view view) {
vp.setcurrentitem(finali);
}
});
//設(shè)置一開始選中狀態(tài)
if (i == 0) {
tabview.setselected(true);
//由于初始化時(shí),onpageselected()選中方法并沒(méi)有的到執(zhí)行,所以主動(dòng)去調(diào)用回調(diào)方法
if (mbottompagechangelistener != null) {
mbottompagechangelistener.onpagechangelistener(i);
}
}
addview(tabview);
}
}
/**
* 提供接口回調(diào)方法,每次滑動(dòng)都通知外界
*/
public interface bottompagechangelistener{
void onpagechangelistener(int position);
}
}
3. 添加 圖標(biāo)自定義類, 該類封裝著底部導(dǎo)航欄中每一個(gè)選項(xiàng)的的圖標(biāo)和文字,將該類型對(duì)象添加到集合中,用于給底部導(dǎo)航欄設(shè)置圖標(biāo);
/**
* 底部導(dǎo)航欄的封裝類,該類對(duì)象用于在底部導(dǎo)航欄添加對(duì)應(yīng)圖標(biāo)和文字
* created by mrzheng on 2017/8/2.
*/
public class botbean {
string content;//圖標(biāo)名字
int uncheckedid;//未選中時(shí)的圖標(biāo)
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實(shí)現(xiàn)完成,在fragment或activity中使用該view:
1. 在布局文件中添加:
android:id="@+id/bottom"
android:layout_width="match_parent"
android:layout_height="60dp">
2. 在活動(dòng)或碎片中添加:
public class mainactivity extends appcompatactivity {
arraylist mfragments;
arraylist mitemicon;//存放底部圖標(biāo)和文字
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("首頁(yè)", r.mipmap.ic_home2));
mitemicon.add(new botbean("通訊錄", r.mipmap.ic_study2));
mitemicon.add(new botbean("發(fā)現(xiàn)", 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) {
//滑動(dòng)后的回調(diào)
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();
}
}
}
總結(jié):該代碼耦合度較高,有些代碼可能不太合理;歡迎大牛們給出合理建議;
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持萬(wàn)仟網(wǎng)。
總結(jié)
以上是生活随笔為你收集整理的android 底部滑动效果怎么做,Android实现简单底部导航栏 Android仿微信滑动切换效果...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IOS – OpenGL ES 调节图像
- 下一篇: qt使用自带的日志输出实例输出日志时,在