Java tutorial
/* * Copyright (C) 2013 www.418log.org * * 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.ab.view.sliding; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Color; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.ab.adapter.AbFragmentPagerAdapter; import com.ab.global.AbAppData; import com.ab.util.AbViewUtil; import com.ab.view.listener.AbOnScrollListener; import com.ab.view.sample.AbHorizontalScrollView; // TODO: Auto-generated Javadoc /** * ??AbSlidingTabView * ??tab. * @author zhaoqp * @date 2011-11-28 * @version */ public class AbSlidingTabView2 extends LinearLayout { /** The tag. */ private static String TAG = "AbSlidingTabView"; /** The Constant D. */ private static final boolean D = AbAppData.DEBUG; /** The context. */ private Context context; /** tab. */ private LinearLayout mTabLayout = null; /** tab. */ private AbHorizontalScrollView mTabScrollView = null; /** The m view pager. */ private ViewPager mViewPager; /**tab*/ private ArrayList<TextView> tabItemList = null; /**View*/ private ArrayList<Fragment> pagerItemList = null; /**tab*/ private List<String> tabItemTextList = null; /** The layout params ff. */ public LinearLayout.LayoutParams layoutParamsFF = null; /** The layout params fw. */ public LinearLayout.LayoutParams layoutParamsFW = null; /** The layout params ww. */ public LinearLayout.LayoutParams layoutParamsWW = null; /**?*/ private ImageView mTabImg; /**???*/ private int mSelectedTabIndex = 0; /**?*/ private AbFragmentPagerAdapter mFragmentPagerAdapter = null; /**tab?*/ private int tabTextSize = 16; /**tab*/ private int tabColor = Color.BLACK; /**tab*/ private int tabSelectColor = Color.BLACK; /**tab?*/ private int tabSlidingHeight = 5; /**?tab?*/ private int startX = 0; /**??*/ private int scrollX = 0; public AbSlidingTabView2(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; layoutParamsFW = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); layoutParamsFF = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); layoutParamsWW = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); this.setOrientation(LinearLayout.VERTICAL); this.setBackgroundColor(Color.rgb(255, 255, 255)); mTabScrollView = new AbHorizontalScrollView(context); mTabScrollView.setHorizontalScrollBarEnabled(false); mTabLayout = new LinearLayout(context); mTabLayout.setOrientation(LinearLayout.HORIZONTAL); mTabLayout.setGravity(Gravity.CENTER); //mTabLayout mTabScrollView.addView(mTabLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.FILL_PARENT)); //Tab? tabItemList = new ArrayList<TextView>(); tabItemTextList = new ArrayList<String>(); this.addView(mTabScrollView, layoutParamsFW); //? mTabImg = new ImageView(context); this.addView(mTabImg, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, tabSlidingHeight)); //View? mViewPager = new ViewPager(context); //ViewPager,setId()id mViewPager.setId(1985); pagerItemList = new ArrayList<Fragment>(); this.addView(mViewPager, layoutParamsFF); //?FragmentActivity if (!(this.context instanceof FragmentActivity)) { Log.e(TAG, "AbSlidingTabView?context,FragmentActivity"); } FragmentManager mFragmentManager = ((FragmentActivity) this.context).getSupportFragmentManager(); mFragmentPagerAdapter = new AbFragmentPagerAdapter(mFragmentManager, pagerItemList); mViewPager.setAdapter(mFragmentPagerAdapter); mViewPager.setOnPageChangeListener(new MyOnPageChangeListener()); mViewPager.setOffscreenPageLimit(3); mTabScrollView.setSmoothScrollingEnabled(true); mTabScrollView.setOnScrollListener(new AbOnScrollListener() { @Override public void onScrollToRight() { if (D) Log.d(TAG, "onScrollToRight"); } @Override public void onScrollToLeft() { if (D) Log.d(TAG, "onScrollToLeft"); } @Override public void onScrollStoped() { if (D) Log.d(TAG, "onScrollStoped"); } @Override public void onScroll(int arg1) { scrollX = arg1; View view = mTabLayout.getChildAt(mSelectedTabIndex); int toX = view.getLeft() - scrollX; if (D) Log.d(TAG, "X" + startX + "to" + toX); imageSlide(mTabImg, startX, toX, 0, 0); startX = toX; } }); } public class MyOnPageChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { //??? computeTabImg(arg0); } } /** * * ?? * @param v * @param startX * @param toX * @param startY * @param toY * @throws */ public void imageSlide(View v, int startX, int toX, int startY, int toY) { TranslateAnimation anim = new TranslateAnimation(startX, toX, startY, toY); anim.setDuration(100); anim.setFillAfter(true); v.startAnimation(anim); } /** * * ??? * @param index * @throws */ public void computeTabImg(int index) { for (int i = 0; i < tabItemList.size(); i++) { TextView tv = tabItemList.get(i); tv.setTextColor(tabColor); tv.setSelected(false); if (index == i) { tv.setTextColor(tabSelectColor); tv.setSelected(true); } } // final View tabView = mTabLayout.getChildAt(index); AbViewUtil.measureView(tabView); LayoutParams mParams = new LayoutParams(tabView.getMeasuredWidth(), tabSlidingHeight); mParams.topMargin = -tabSlidingHeight; mTabImg.setLayoutParams(mParams); if (D) Log.d(TAG, "old--startX:" + startX); //????????tab if (D) Log.d(TAG, "view" + index + ":" + tabView.getMeasuredWidth()); if (D) Log.d(TAG, "ScrollView:" + mTabScrollView.getWidth()); if (D) Log.d(TAG, "scrollX:" + scrollX); if (D) Log.d(TAG, "tabView right:" + tabView.getRight()); if (D) Log.d(TAG, "tabView left:" + tabView.getLeft()); if (mSelectedTabIndex < index && tabView.getRight() - scrollX > mTabScrollView.getWidth()) { if (D) Log.d(TAG, "??"); int offsetX = 0; //?? if (index == mTabLayout.getChildCount() - 1) { offsetX = tabView.getRight() - mTabScrollView.getWidth() - scrollX; mTabScrollView.smoothScrollBy(offsetX, 0); scrollX = scrollX + offsetX; if (D) Log.d(TAG, "startX:" + startX + ",offsetX:" + offsetX); imageSlide(mTabImg, startX, mTabScrollView.getWidth() - tabView.getMeasuredWidth(), 0, 0); startX = mTabScrollView.getWidth() - tabView.getMeasuredWidth(); } else { offsetX = tabView.getMeasuredWidth(); mTabScrollView.smoothScrollBy(offsetX, 0); scrollX = scrollX + offsetX; if (D) Log.d(TAG, "startX:" + startX + ",offsetX:" + offsetX); int toX = tabView.getLeft() - scrollX; imageSlide(mTabImg, startX, toX, 0, 0); startX = toX; } } else if (mSelectedTabIndex > index && tabView.getLeft() < scrollX) { if (D) Log.d(TAG, "?"); //? offsetX int offsetX = 0; if (index == 0) { offsetX = -scrollX; mTabScrollView.smoothScrollBy(offsetX, 0); scrollX = scrollX + offsetX; imageSlide(mTabImg, startX, 0, 0, 0); startX = 0; } else { offsetX = -tabView.getMeasuredWidth(); mTabScrollView.smoothScrollBy(offsetX, 0); scrollX = scrollX + offsetX; if (D) Log.d(TAG, "startX2:" + startX + ",offsetX:" + offsetX); int toX = tabView.getLeft() - scrollX; imageSlide(mTabImg, startX, toX, 0, 0); startX = toX; } } else { int toX = tabView.getLeft() - scrollX; imageSlide(mTabImg, startX, toX, 0, 0); startX = toX; } mSelectedTabIndex = index; } /** * * ??tab * @throws */ public void addItemViews(List<String> tabTexts, List<Fragment> fragments) { tabItemTextList.addAll(tabTexts); pagerItemList.addAll(fragments); tabItemList.clear(); mTabLayout.removeAllViews(); for (int i = 0; i < tabItemTextList.size(); i++) { final int index = i; String text = tabItemTextList.get(i); TextView tv = new TextView(this.context); tv.setTextColor(tabColor); tv.setTextSize(tabTextSize); tv.setText(text); tv.setGravity(Gravity.CENTER); tv.setLayoutParams(new LayoutParams(0, LayoutParams.FILL_PARENT, 1)); tv.setPadding(12, 5, 12, 5); tv.setFocusable(false); tabItemList.add(tv); mTabLayout.addView(tv); tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { mViewPager.setCurrentItem(index); } }); } //? mFragmentPagerAdapter.notifyDataSetChanged(); mViewPager.setCurrentItem(0); computeTabImg(0); } /** * * ??tab * @throws */ public void addItemView(String tabText, Fragment fragment) { tabItemTextList.add(tabText); pagerItemList.add(fragment); tabItemList.clear(); mTabLayout.removeAllViews(); for (int i = 0; i < tabItemTextList.size(); i++) { final int index = i; String text = tabItemTextList.get(i); TextView tv = new TextView(this.context); tv.setTextColor(tabColor); tv.setTextSize(tabTextSize); tv.setText(text); tv.setGravity(Gravity.CENTER); tv.setLayoutParams(new LayoutParams(0, LayoutParams.FILL_PARENT, 1)); tv.setPadding(12, 5, 12, 5); tv.setFocusable(false); tabItemList.add(tv); mTabLayout.addView(tv); tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { mViewPager.setCurrentItem(index); } }); } //? Log.d(TAG, "addItemView finish"); mFragmentPagerAdapter.notifyDataSetChanged(); mViewPager.setCurrentItem(0); computeTabImg(0); } /** * * ??? * @param index * @throws */ public void removeItemView(int index) { tabItemList.remove(index); mTabLayout.removeViewAt(index); pagerItemList.remove(index); mFragmentPagerAdapter.notifyDataSetChanged(); } /** * * ?? * @throws */ public void removeAllItemView(int index) { tabItemList.clear(); mTabLayout.removeAllViews(); pagerItemList.clear(); mFragmentPagerAdapter.notifyDataSetChanged(); } /** * * ???ViewViewPager * @return * @throws */ public ViewPager getViewPager() { return mViewPager; } public LinearLayout getTabLayout() { return mTabLayout; } /** * * ??Tab * @param res * @throws */ public void setTabLayoutBackground(int res) { this.mTabLayout.setBackgroundResource(res); } public int getTabColor() { return tabColor; } /** * * ??tab? * @param tabColor * @throws */ public void setTabColor(int tabColor) { this.tabColor = tabColor; } /** * * ??? * @param tabColor * @throws */ public void setTabSelectColor(int tabColor) { this.tabSelectColor = tabColor; this.mTabImg.setBackgroundColor(tabColor); } public int getTabTextSize() { return tabTextSize; } public void setTabTextSize(int tabTextSize) { this.tabTextSize = tabTextSize; } /** * * ???tab? * @param left * @param top * @param right * @param bottom * @throws */ public void setTabPadding(int left, int top, int right, int bottom) { for (int i = 0; i < tabItemList.size(); i++) { TextView tv = tabItemList.get(i); tv.setPadding(left, top, right, bottom); } } public int getTabSlidingHeight() { return tabSlidingHeight; } /** * * ??? * @param tabSlidingHeight * @throws */ public void setTabSlidingHeight(int tabSlidingHeight) { this.tabSlidingHeight = tabSlidingHeight; } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }