国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android自定義ViewPager指示器

2019-12-12 04:49:48
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例為大家分享了Android ViewPager指示器的制作方法,供大家參考,具體內(nèi)容如下

1.概述

  ViewPageIndicator這個(gè)開(kāi)源框架大家都接觸過(guò),個(gè)人感覺(jué)還不錯(cuò)就是用起來(lái)比較麻煩,需要這里配置那里配置效果定制起來(lái)也不方便。我第一次使用的時(shí)候就一直出不來(lái)效果,后來(lái)找了很久發(fā)現(xiàn)是activity的主題沒(méi)有配置好。今天我們自己來(lái)造個(gè)輪子實(shí)現(xiàn)一把,其中用到了Adapter模式,如果不清楚這個(gè)模式的請(qǐng)看我的Android源碼設(shè)計(jì)模式分析://m.survivalescaperooms.com/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的滾動(dòng)監(jiān)聽(tīng),使ViewPager和TabView一起聯(lián)動(dòng)

 @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)行滾動(dòng)  */ 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;  // 滾動(dòng)的距離  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).最后我們來(lái)看在activity中怎么使用,在IndicatorAdapter有四個(gè)方法,我們只需要實(shí)現(xiàn)一個(gè)方法,其余三個(gè)方法如果不使用可以不復(fù)寫(xiě)。以Adapter的形式暴露出來(lái),那么用戶(hù)可以自己去實(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.VeVB.COm/201611/yuanma/AndroidViewPager(VeVB.COm).rar

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 邻水| 修水县| 高邑县| 扶沟县| 渭南市| 淮滨县| 庄浪县| 新巴尔虎左旗| 茶陵县| 通州区| 沂源县| 澄城县| 三穗县| 称多县| 尼玛县| 长武县| 南溪县| 东平县| 江永县| 肇东市| 郑州市| 苏尼特左旗| 博爱县| 克拉玛依市| 鹤庆县| 天津市| 岱山县| 巫溪县| 澎湖县| 宁德市| 陆丰市| 汶川县| 宁乡县| 普陀区| 呈贡县| 开原市| 平南县| 乌鲁木齐县| 赣榆县| 南安市| 邹平县|