Blame | Last modification | View Log | RSS feed
/** Copyright (C) 2011 The Android Open Source Project* Copyright (C) 2012 Jake Wharton** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.viewpagerindicator;import android.content.Context;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.util.AttributeSet;import android.view.Gravity;import android.view.View;import android.widget.HorizontalScrollView;import android.widget.ImageView;import static android.view.ViewGroup.LayoutParams.FILL_PARENT;import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;/*** This widget implements the dynamic action bar tab behavior that can change* across different configurations or circumstances.*/public class IconPageIndicator extends HorizontalScrollView implements PageIndicator {private final IcsLinearLayout mIconsLayout;private ViewPager mViewPager;private OnPageChangeListener mListener;private Runnable mIconSelector;private int mSelectedIndex;public IconPageIndicator(Context context) {this(context, null);}public IconPageIndicator(Context context, AttributeSet attrs) {super(context, attrs);setHorizontalScrollBarEnabled(false);mIconsLayout = new IcsLinearLayout(context, R.attr.vpiIconPageIndicatorStyle);addView(mIconsLayout, new LayoutParams(WRAP_CONTENT, FILL_PARENT, Gravity.CENTER));}private void animateToIcon(final int position) {final View iconView = mIconsLayout.getChildAt(position);if (mIconSelector != null) {removeCallbacks(mIconSelector);}mIconSelector = new Runnable() {public void run() {final int scrollPos = iconView.getLeft() - (getWidth() - iconView.getWidth()) / 2;smoothScrollTo(scrollPos, 0);mIconSelector = null;}};post(mIconSelector);}@Overridepublic void onAttachedToWindow() {super.onAttachedToWindow();if (mIconSelector != null) {// Re-post the selector we savedpost(mIconSelector);}}@Overridepublic void onDetachedFromWindow() {super.onDetachedFromWindow();if (mIconSelector != null) {removeCallbacks(mIconSelector);}}@Overridepublic void onPageScrollStateChanged(int arg0) {if (mListener != null) {mListener.onPageScrollStateChanged(arg0);}}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {if (mListener != null) {mListener.onPageScrolled(arg0, arg1, arg2);}}@Overridepublic void onPageSelected(int arg0) {setCurrentItem(arg0);if (mListener != null) {mListener.onPageSelected(arg0);}}@Overridepublic void setViewPager(ViewPager view) {if (mViewPager == view) {return;}if (mViewPager != null) {mViewPager.setOnPageChangeListener(null);}PagerAdapter adapter = view.getAdapter();if (adapter == null) {throw new IllegalStateException("ViewPager does not have adapter instance.");}mViewPager = view;view.setOnPageChangeListener(this);notifyDataSetChanged();}public void notifyDataSetChanged() {mIconsLayout.removeAllViews();IconPagerAdapter iconAdapter = (IconPagerAdapter) mViewPager.getAdapter();int count = iconAdapter.getCount();for (int i = 0; i < count; i++) {ImageView view = new ImageView(getContext(), null, R.attr.vpiIconPageIndicatorStyle);view.setImageResource(iconAdapter.getIconResId(i));mIconsLayout.addView(view);}if (mSelectedIndex > count) {mSelectedIndex = count - 1;}setCurrentItem(mSelectedIndex);requestLayout();}@Overridepublic void setViewPager(ViewPager view, int initialPosition) {setViewPager(view);setCurrentItem(initialPosition);}@Overridepublic void setCurrentItem(int item) {if (mViewPager == null) {throw new IllegalStateException("ViewPager has not been bound.");}mSelectedIndex = item;mViewPager.setCurrentItem(item);int tabCount = mIconsLayout.getChildCount();for (int i = 0; i < tabCount; i++) {View child = mIconsLayout.getChildAt(i);boolean isSelected = (i == item);child.setSelected(isSelected);if (isSelected) {animateToIcon(item);}}}@Overridepublic void setOnPageChangeListener(OnPageChangeListener listener) {mListener = listener;}}