欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義ViewPager指示器

 更新時間:2016年11月02日 11:12:59   作者:z240336124  
這篇文章主要為大家詳細介紹了Android自定義ViewPager指示器的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

1.概述

  ViewPageIndicator這個開源框架大家都接觸過,個人感覺還不錯就是用起來比較麻煩,需要這里配置那里配置效果定制起來也不方便。我第一次使用的時候就一直出不來效果,后來找了很久發(fā)現是activity的主題沒有配置好。今天我們自己來造個輪子實現一把,其中用到了Adapter模式,如果不清楚這個模式的請看我的Android源碼設計模式分析:http://www.dbjr.com.cn/article/96291.htm,下面看一下效果:

  

2.實現 

1).實現基本效果自定義HorizontalScrollView extends HorizontalScrollView,設置ViewPager根據個數不斷遍歷添加子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)遍歷設置Tab寬度
     for (int index = 0; index < childCount; index++) {
      LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mContanierGroup
        .getTabView(index).getLayoutParams();
      params.width = tabWidth;
     }

     // 設置寬度,高度,和角標指示器
     mContanierGroup.setTabWidth(tabWidth);
     mContanierGroup.getContainer().getLayoutParams().height = getHeight();
     mContanierGroup.setIndicatorView(mAdapter.getIndexView());

     mRunnable = null;
    }
   };

   post(mRunnable);
  }
 }
}

2).設置ViewPager的滾動監(jiān)聽,使ViewPager和TabView一起聯動

 @Override
 public void onPageScrollStateChanged(int position) {
  if (position == 0) {
   // 設置為不是點擊
   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);


 }

 /**
  * 指示器跟隨手指進行滾動
  */
 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模式,完成高亮和下標指示器。

public abstract class IndicatorAdapter<T extends View> {
 /**
  * 獲取Tab View
  */
 public abstract T getTabView(int position);

 /**
  * 獲取角標View
  */
 public View getIndexView() {
  return null;
 }

 /**
  * 高亮當前Tab
  */
 public void highLightTabView(T tabView) {

 }

 /**
  * 恢復當前Tab
  */
 public void restoreTabView(T tabView) {

 }
}

4).最后我們來看在activity中怎么使用,在IndicatorAdapter有四個方法,我們只需要實現一個方法,其余三個方法如果不使用可以不復寫。以Adapter的形式暴露出來,那么用戶可以自己去實現而不必受局限。

 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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android使用criteria選擇合適的地理位置服務實現方法

    Android使用criteria選擇合適的地理位置服務實現方法

    這篇文章主要介紹了Android使用criteria選擇合適的地理位置服務實現方法,實例分析了Criteria的具體使用技巧,需要的朋友可以參考下
    2016-01-01
  • Android自定義評分控件的完整實例

    Android自定義評分控件的完整實例

    在Android開發(fā)中,我們經常會用到對商家或者商品的評價,運用星星進行打分,下面這篇文章主要給大家介紹了關于Android自定義評分控件的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • Android 的Bitmap的修改方法

    Android 的Bitmap的修改方法

    Android 的Bitmap的修改方法,需要的朋友可以參考一下
    2013-05-05
  • Flutter實現掃二維碼功能

    Flutter實現掃二維碼功能

    這篇文章主要為大家詳細介紹了Flutter實現掃二維碼功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android實現從相冊選擇照片功能

    Android實現從相冊選擇照片功能

    這篇文章主要為大家詳細介紹了Android實現從相冊選擇照片功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 淺析Android手機衛(wèi)士接收短信指令執(zhí)行相應操作

    淺析Android手機衛(wèi)士接收短信指令執(zhí)行相應操作

    通過廣播接收者,接收到短信,對短信內容進行判斷,如果為我們指定的值就執(zhí)行相應的操作。本文給大家介紹Android手機衛(wèi)士接收短信指令執(zhí)行相應操作,感興趣的朋友參考下吧
    2016-04-04
  • Android Activity 與Service進行數據交互詳解

    Android Activity 與Service進行數據交互詳解

    這篇文章主要介紹了Android Activity 與Service進行數據交互的相關資料,在開發(fā)Android App的時候經常會使用這樣的功能,需要的朋友可以參考下
    2016-10-10
  • Kotlin?協程思維模型的引入使用建立

    Kotlin?協程思維模型的引入使用建立

    這篇文章主要為大家介紹了Kotlin?協程思維模型的引入使用及建立詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • android使用include調用內部組件的方法

    android使用include調用內部組件的方法

    這篇文章主要介紹了android使用include調用內部組件的方法,涉及Android組件調用的相關技巧,需要的朋友可以參考下
    2015-05-05
  • Flutter中實現交互式Webview的方法詳解

    Flutter中實現交互式Webview的方法詳解

    Flutter是一款強大的跨平臺移動應用開發(fā)框架,而Webview則是在應用中展示Web內容的重要組件,本文將介紹如何在Flutter應用中實現交互式的Webview,快跟隨小編一起學習一下吧
    2023-09-09

最新評論