Android自定義ViewPager指示器
本文實(shí)例為大家分享了Android ViewPager指示器的制作方法,供大家參考,具體內(nèi)容如下
1.概述
ViewPageIndicator這個(gè)開源框架大家都接觸過,個(gè)人感覺還不錯(cuò)就是用起來比較麻煩,需要這里配置那里配置效果定制起來也不方便。我第一次使用的時(shí)候就一直出不來效果,后來找了很久發(fā)現(xiàn)是activity的主題沒有配置好。今天我們自己來造個(gè)輪子實(shí)現(xiàn)一把,其中用到了Adapter模式,如果不清楚這個(gè)模式的請看我的Android源碼設(shè)計(jì)模式分析:http://www.dbjr.com.cn/article/96291.htm,下面看一下效果:
2.實(shí)現(xiàn)
1).實(shí)現(xiàn)基本效果自定義HorizontalScrollView extends HorizontalScrollView,設(shè)置ViewPager根據(jù)個(gè)數(shù)不斷遍歷添加子View。
public class ViewPagerIndicator extends HorizontalScrollView{
public ViewPagerIndicator(Context context) {
this(context, null);
}
public ViewPagerIndicator(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ViewPagerIndicator(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
}
@Override
public void setViewPager(ViewPager viewPager) {
if (viewPager == null) {
throw new NullPointerException("viewPager is null...");
}
this.mViewPager = viewPager;
int count = mViewPager.getAdapter().getCount();
mContanierGroup.removeAllViews();
// 循環(huán)添加tabView(TextView)
for (int i = 0; i < count; i++) {
final TextView itemTv = new TextView(mContext);
itemTv.setText(this.mViewPager.getAdapter().getPageTitle(i));
setItemClickEvent(itemTv, i);
mContanierGroup.addTabView(itemTv);
setItemClickEvent(itemTv, i);
mContanierGroup.addTabView(itemTv);
}
setItemParams();
mAdapter.highLightTabView(mContanierGroup.getTabView(mCureentItem));
this.mViewPager.setOnPageChangeListener(this);
}
private void setItemParams() {
if (mVisibleTabCount != 0) {
final int childCount = mViewPager.getAdapter().getCount();
mRunnable = new Runnable() {
@Override
public void run() {
int tabWidth = getWidth() / mVisibleTabCount;
// 循環(huán)遍歷設(shè)置Tab寬度
for (int index = 0; index < childCount; index++) {
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mContanierGroup
.getTabView(index).getLayoutParams();
params.width = tabWidth;
}
// 設(shè)置寬度,高度,和角標(biāo)指示器
mContanierGroup.setTabWidth(tabWidth);
mContanierGroup.getContainer().getLayoutParams().height = getHeight();
mContanierGroup.setIndicatorView(mAdapter.getIndexView());
mRunnable = null;
}
};
post(mRunnable);
}
}
}
2).設(shè)置ViewPager的滾動監(jiān)聽,使ViewPager和TabView一起聯(lián)動
@Override
public void onPageScrollStateChanged(int position) {
if (position == 0) {
// 設(shè)置為不是點(diǎn)擊
mIsClick = false;
}
if (mPageChangeListener != null)
mPageChangeListener.onPageScrollStateChanged(position);
}
@Override
public void onPageScrolled(int position, float offset, int arg2) {
scroll(position, offset);
if (mPageChangeListener != null)
mPageChangeListener.onPageScrolled(position, offset, arg2);
}
@Override
public void onPageSelected(int position) {
mCureentItem = position;
if (mPageChangeListener != null)
mPageChangeListener.onPageSelected(position);
}
/**
* 指示器跟隨手指進(jìn)行滾動
*/
public void scroll(int position, float offset) {
int tabWidth = mContanierGroup.getTabView(0).getWidth();
// 讓選中Tab的一直在最中間
int total = (int) ((position + offset) * tabWidth);
int green = (getWidth() - tabWidth) / 2;
// 滾動的距離
int scroll = total - green;
if (!mIsClick) {
this.scrollTo(scroll, 0);
mContanierGroup.scrollIndicator(position, offset);
}
}
3).最后我們采用適配器Adapter模式,完成高亮和下標(biāo)指示器。
public abstract class IndicatorAdapter<T extends View> {
/**
* 獲取Tab View
*/
public abstract T getTabView(int position);
/**
* 獲取角標(biāo)View
*/
public View getIndexView() {
return null;
}
/**
* 高亮當(dāng)前Tab
*/
public void highLightTabView(T tabView) {
}
/**
* 恢復(fù)當(dāng)前Tab
*/
public void restoreTabView(T tabView) {
}
}
4).最后我們來看在activity中怎么使用,在IndicatorAdapter有四個(gè)方法,我們只需要實(shí)現(xiàn)一個(gè)方法,其余三個(gè)方法如果不使用可以不復(fù)寫。以Adapter的形式暴露出來,那么用戶可以自己去實(shí)現(xiàn)而不必受局限。
mIndicator.setAdapter(mViewpager, new IndicatorAdapter<TextView>() {
@Override
public TextView getTabView(int position) {
TextView tabView = new TextView(getBaseContext());
tabView.setTextColor(Color.WHITE);
tabView.setText(mTitles.get(position));
tabView.setPadding(20, 20, 20, 20);
tabView.setGravity(Gravity.CENTER);
return tabView;
}
@Override
public View getIndexView() {
ImageView view = new ImageView(getBaseContext());
view.setImageResource(R.drawable.corners_login_nomral);
view.setPadding(25, 0, 25, 0);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, 6);
view.setLayoutParams(params);
return view;
}
@Override
public void highLightTabView(TextView tabView) {
final TextView itemView = (TextView) tabView;
itemView.setTextColor(Color.RED);
}
@Override
public void restoreTabView(TextView tabView) {
final TextView itemView = (TextView) tabView;
itemView.setTextColor(Color.WHITE);
}
});
不需配置的ViewPagerIndicator 的源碼下載:http://xiazai.jb51.net/201611/yuanma/AndroidViewPager(jb51.net).rar
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android ViewPager自定義輪播圖并解決播放沖突
- Android自定義引導(dǎo)玩轉(zhuǎn)ViewPager的方法詳解
- Android自定義ViewPager實(shí)現(xiàn)縱向滑動翻頁效果
- Android使用自定義PageTransformer實(shí)現(xiàn)個(gè)性的ViewPager動畫切換效果
- android自定義ViewPager水平滑動彈性效果
- Android 自定義布局豎向的ViewPager的實(shí)現(xiàn)
- Android自定義ViewPager實(shí)現(xiàn)個(gè)性化的圖片切換效果
- Android自定義ViewPager實(shí)例
- Android自定義超級炫酷的ViewPage指示器
相關(guān)文章
Android使用criteria選擇合適的地理位置服務(wù)實(shí)現(xiàn)方法
這篇文章主要介紹了Android使用criteria選擇合適的地理位置服務(wù)實(shí)現(xiàn)方法,實(shí)例分析了Criteria的具體使用技巧,需要的朋友可以參考下2016-01-01
淺析Android手機(jī)衛(wèi)士接收短信指令執(zhí)行相應(yīng)操作
通過廣播接收者,接收到短信,對短信內(nèi)容進(jìn)行判斷,如果為我們指定的值就執(zhí)行相應(yīng)的操作。本文給大家介紹Android手機(jī)衛(wèi)士接收短信指令執(zhí)行相應(yīng)操作,感興趣的朋友參考下吧2016-04-04
Android Activity 與Service進(jìn)行數(shù)據(jù)交互詳解
這篇文章主要介紹了Android Activity 與Service進(jìn)行數(shù)據(jù)交互的相關(guān)資料,在開發(fā)Android App的時(shí)候經(jīng)常會使用這樣的功能,需要的朋友可以參考下2016-10-10
android使用include調(diào)用內(nèi)部組件的方法
這篇文章主要介紹了android使用include調(diào)用內(nèi)部組件的方法,涉及Android組件調(diào)用的相關(guān)技巧,需要的朋友可以參考下2015-05-05
Flutter中實(shí)現(xiàn)交互式Webview的方法詳解
Flutter是一款強(qiáng)大的跨平臺移動應(yīng)用開發(fā)框架,而Webview則是在應(yīng)用中展示W(wǎng)eb內(nèi)容的重要組件,本文將介紹如何在Flutter應(yīng)用中實(shí)現(xiàn)交互式的Webview,快跟隨小編一起學(xué)習(xí)一下吧2023-09-09

