| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- /*
- * 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);
- }
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
- if (mIconSelector != null) {
- // Re-post the selector we saved
- post(mIconSelector);
- }
- }
- @Override
- public void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- if (mIconSelector != null) {
- removeCallbacks(mIconSelector);
- }
- }
- @Override
- public void onPageScrollStateChanged(int arg0) {
- if (mListener != null) {
- mListener.onPageScrollStateChanged(arg0);
- }
- }
- @Override
- public void onPageScrolled(int arg0, float arg1, int arg2) {
- if (mListener != null) {
- mListener.onPageScrolled(arg0, arg1, arg2);
- }
- }
- @Override
- public void onPageSelected(int arg0) {
- setCurrentItem(arg0);
- if (mListener != null) {
- mListener.onPageSelected(arg0);
- }
- }
- @Override
- public 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();
- }
- @Override
- public void setViewPager(ViewPager view, int initialPosition) {
- setViewPager(view);
- setCurrentItem(initialPosition);
- }
- @Override
- public 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);
- }
- }
- }
- @Override
- public void setOnPageChangeListener(OnPageChangeListener listener) {
- mListener = listener;
- }
- }
|