package com.cheng.animationstudy.activity;
import android.annotation.SuppressLint;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.cheng.animationstudy.R;
import com.cheng.animationstudy.customview.wandoujia.MyScrollView;
import com.cheng.utils.Logger;
import com.cheng.utils.ViewFinder;
import java.lang.ref.WeakReference;
/**
* 模仿豌豆荚首页
*/
public class ImitateWandoujiaActivity extends AppCompatActivity implements MyScrollView.OnScrollChangedListener, View.OnTouchListener,View.OnClickListener {
private final static int MSG_PULL_RECOVER = 0x999;
private ViewPager mMainVP;
private MyScrollView mMainSV;
private View mVHeaderContainer;
private View mSearchBarView;
private View mMainNavView;
private View mMainNavLeftContainerView;
private RadioGroup mMNavMidRG;
private View mMNavRightContainerView;
private RadioButton mMainNavIndexRB;
private RadioButton mMainNavDiscoverRB;
private RadioButton mMainNavBlogRB;
private RadioButton mMainNavMineRB;
private RadioButton mMainNavMoreRB;
private View mIndexHeaderNavView;
private View mIndexNavDiscoverView;
private View mIndexNavBlogView;
private View mIndexNavMineView;
private View mIndexNavMoreView;
private TextView mIndexNavDiscoverTV;
private TextView mIndexNavBlogTV;
private TextView mIndexNavMineTV;
private TextView mIndexNavMoreTV;
private boolean mIsInitFactor = false;
private int mMaxScrollTop;
private int mScrollerOldNewTop;
private int mTextFadeBeginScrollTop;
private int mTextFadeEndScrollTop;
private float mTextFadeFactor;
private int mCurrentTextAlpha;
private int mMainNavFadeBeginScrollTop;
private int mMainNavFadeEndScrollTop;
private float mMainNavFadeFactor;
private float mCurrentMainNavAlpha;
private int mIndexNavZoomBeginScrollTop;
private int mIndexNavZoomEndScrollTop;
private float mIndexNavMoveLeftFactor;
private float mIndexNavMoveRightFactor;
private int mFinalIndexNavPaddingLeft;
private int mFinalIndexNavPaddingRight;
private int mCurrentIndexNavPaddingLeft;
private int mCurrentIndexNavPaddingRight;
private int mMainNavTranBeginScrollTop;
private int mMainNavTranEndScrollTop;
private float mMNavIndexFactor;
private float mMNavMidTGroupFactor;
private float mMNavRightContainerFactor;
private int mOrginMNavIndexMarginLeft;
private int mOrginMNavMidTGroupMarginTop;
private int mOrginMNavRightContainerMarginRight;
private int mCurrentMNavIndexMarginLeft;
private int mCurrentMNavMidTGroupMarginTop;
private int mCurrentMNavRightContainerMarginRight;
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_imitatewandoujia);
initView();
initListener();
initData();
}
private void initView() {
this.mMainSV = (MyScrollView) findViewById(R.id.sdi_wdj_msv);
this.mMainVP = (ViewPager) findViewById(R.id.sdi_wdj_mainvp);
this.mVHeaderContainer = findViewById(R.id.header_container);
this.mIndexHeaderNavView = ViewFinder.findViewById(mVHeaderContainer, R.id.index_header_nav);
this.mIndexNavDiscoverView = ViewFinder.findViewById(mIndexHeaderNavView,R.id.discover_item);
this.mIndexNavBlogView = ViewFinder.findViewById(mIndexHeaderNavView,R.id.blog_item);
this.mIndexNavMineView = ViewFinder.findViewById(mIndexHeaderNavView,R.id.mine_item);
this.mIndexNavMoreView = ViewFinder.findViewById(mIndexHeaderNavView,R.id.more_item);
this.mIndexNavDiscoverTV = ViewFinder.findViewById(mIndexNavDiscoverView,R.id.nav_text_tv);
this.mIndexNavBlogTV = ViewFinder.findViewById(mIndexNavBlogView,R.id.nav_text_tv);
this.mIndexNavMineTV = ViewFinder.findViewById(mIndexNavMineView,R.id.nav_text_tv);
this.mIndexNavMoreTV = ViewFinder.findViewById(mIndexNavMoreView,R.id.nav_text_tv);
this.mSearchBarView = ViewFinder.findViewById(mVHeaderContainer,R.id.search_bar);
this.mMainNavView = findViewById(R.id.main_nav);
this.mMNavRightContainerView = ViewFinder.findViewById(mMainNavView,R.id.right_container);
this.mMainNavLeftContainerView = ViewFinder.findViewById(mMainNavView,R.id.main_nav_layout);
this.mMNavMidRG = ViewFinder.findViewById(mMainNavView,R.id.middle_tab_group);
this.mMainNavIndexRB = ViewFinder.findViewById(mMainNavView,R.id.main_tab_index);
this.mMainNavDiscoverRB = ViewFinder.findViewById(mMainNavView,R.id.main_tab_ranking);
this.mMainNavBlogRB = ViewFinder.findViewById(mMainNavView,R.id.main_tab_blog);
this.mMainNavMineRB = ViewFinder.findViewById(mMainNavView,R.id.main_tab_mine);
this.mMainNavMoreRB = ViewFinder.findViewById(mMainNavView,R.id.main_tab_more);
}
private void initListener() {
this.mMainNavIndexRB.setOnClickListener(this);
this.mMainNavDiscoverRB.setOnClickListener(this);
this.mMainNavBlogRB.setOnClickListener(this);
this.mMainNavMineRB.setOnClickListener(this);
this.mMainNavMoreRB.setOnClickListener(this);
this.mMainSV.setOnScrollChangedListener(this);
this.mMainSV.setOnTouchListener(this);
}
private void initData() {
this.mHandler = new InnerHandler(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_tab_index:
tabIndex();
break;
case R.id.main_tab_ranking:
tabRanking();
break;
}
}
private void tabIndex() {
mMainSV.setVisibility(View.VISIBLE);
mMainVP.setVisibility(View.GONE);
RadioButton rbChild;
int childCount = mMNavMidRG.getChildCount();
for (int childIndex=0; childIndex<childCount; childIndex++) {
rbChild = (RadioButton) mMNavMidRG.getChildAt(childIndex);
rbChild.setChecked(false);
}
}
private void tabRanking() {
mMainSV.setVisibility(View.GONE);
mMainNavIndexRB.setChecked(false);
mMainNavDiscoverRB.setChecked(true);
mMainVP.setVisibility(View.VISIBLE);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (!mIsInitFactor) {
int mMainNavHeight = mMainNavView.getBottom();
int mSearchBarTop = mSearchBarView.getTop();
int mSearchBarBottom = mSearchBarView.getBottom();
int mIndexNavTop = mIndexHeaderNavView.getTop();
int mTextFadeDis = getResources().getDimensionPixelOffset(R.dimen.app_padding);
int mVMainNavIndexWidth = mMainNavIndexRB.getWidth();
int mVIndexHeaderNavBottom = mIndexHeaderNavView.getBottom();
int mMNRightContainerWidth = mMNavRightContainerView.getWidth();
mMaxScrollTop = mVIndexHeaderNavBottom;
mTextFadeEndScrollTop = (int) (mSearchBarTop - mMainNavHeight * 0.5f);
mTextFadeBeginScrollTop = mTextFadeEndScrollTop - mTextFadeDis;
mTextFadeFactor = 255.0f / mTextFadeDis;
mCurrentTextAlpha = 255;
mMainNavFadeBeginScrollTop = mTextFadeEndScrollTop;
mMainNavFadeEndScrollTop = mMainNavFadeBeginScrollTop + mMainNavHeight;
mCurrentMainNavAlpha = 0.0f;
mMainNavFadeFactor = 1.0f / mMainNavHeight;
changeMainNavAlpha(0);
mIndexNavZoomBeginScrollTop = mSearchBarBottom - mMainNavHeight;
mIndexNavZoomEndScrollTop = mIndexNavTop - mMainNavHeight;
float zoomDistance = mIndexNavZoomEndScrollTop - mIndexNavZoomBeginScrollTop;
mFinalIndexNavPaddingLeft = mMainNavIndexRB.getWidth();
mFinalIndexNavPaddingRight = (mIndexHeaderNavView.getRight() - mMainNavLeftContainerView.getWidth());
mIndexNavMoveLeftFactor = mFinalIndexNavPaddingLeft / zoomDistance;
mIndexNavMoveRightFactor = mFinalIndexNavPaddingRight / zoomDistance;
mMainNavTranBeginScrollTop = mIndexNavZoomEndScrollTop;
mMainNavTranEndScrollTop = mIndexNavZoomEndScrollTop + mMainNavHeight;
mOrginMNavIndexMarginLeft = -mVMainNavIndexWidth;
mIndexNavMoveLeftFactor = mFinalIndexNavPaddingLeft / zoomDistance;
mIndexNavMoveRightFactor = mFinalIndexNavPaddingRight / zoomDistance;
mMainNavTranBeginScrollTop = mIndexNavZoomEndScrollTop;
mMainNavTranEndScrollTop = mIndexNavZoomEndScrollTop + mMainNavHeight;
mOrginMNavIndexMarginLeft = -mVMainNavIndexWidth;
mOrginMNavMidTGroupMarginTop = mMainNavHeight;
mOrginMNavRightContainerMarginRight = -mMNRightContainerWidth;
mMNavIndexFactor = mVMainNavIndexWidth / (float)mMainNavHeight;
mMNavRightContainerFactor = mMNRightContainerWidth / (float)mMainNavHeight;
mMNavMidTGroupFactor = 1.0f;
mCurrentMNavIndexMarginLeft = mOrginMNavIndexMarginLeft;
mCurrentMNavMidTGroupMarginTop = mOrginMNavMidTGroupMarginTop;
mCurrentMNavRightContainerMarginRight = mOrginMNavRightContainerMarginRight;
setLeftMargin(mMainNavIndexRB, mCurrentMNavIndexMarginLeft);
setRightMargin(mMNavRightContainerView, mOrginMNavRightContainerMarginRight);
setTopMargin(mMNavMidRG, mOrginMNavMidTGroupMarginTop);
mIsInitFactor = true;
}
}
@Override
public void onScrollChanged(int newLeft, int newTop, int oldLeft, int oldTop) {
if (mScrollerOldNewTop==newTop || oldTop>mMaxScrollTop) {
return;
}
mScrollerOldNewTop = newTop;
fadeTextOnScroll(newLeft, newTop, oldLeft, oldTop);
fadeMainNavOnScroll(newLeft, newTop, oldLeft, oldTop);
zoomIndexNavOnScroll(newLeft, newTop, oldLeft, oldTop);
transferMainNavOnScroll(newLeft, newTop, oldLeft, oldTop);
}
/**
* 文字随着活动逐步消失或者显示
*/
private void fadeTextOnScroll(int newLeft, int newTop, int oldLeft, int oldTop){
// 上滑上界
if (newTop >= mTextFadeEndScrollTop) {
mCurrentTextAlpha = 0;
changeIndexNavTextAlpha(0);
return;
}
//下滑下界
if(newTop <= mTextFadeBeginScrollTop){
mCurrentTextAlpha = 255;
changeIndexNavTextAlpha(255);
return;
}
//上滑下交界
if(mTextFadeBeginScrollTop<oldTop && newTop >mTextFadeBeginScrollTop){
mCurrentTextAlpha = (int) (255 - (newTop - mTextFadeBeginScrollTop) * mTextFadeFactor);
ensureFadeTextAlphaRight(newTop, oldTop);
changeIndexNavTextAlpha(mCurrentTextAlpha);
return;
}
//下滑上交界
if(mTextFadeEndScrollTop < oldTop && newTop < mTextFadeEndScrollTop){
mCurrentTextAlpha = (int) ((mTextFadeEndScrollTop - oldTop) * mTextFadeFactor);
ensureFadeTextAlphaRight(newTop, oldTop);
changeIndexNavTextAlpha(mCurrentTextAlpha);
return;
}
//中间状态
if( mTextFadeBeginScrollTop <= oldTop && oldTop <= mTextFadeEndScrollTop){
mCurrentTextAlpha = (int) (mCurrentTextAlpha - (newTop - oldTop) * mTextFadeFactor);
ensureFadeTextAlphaRight(newTop, oldTop);
changeIndexNavTextAlpha(mCurrentTextAlpha);
}
}
private void ensureFadeTextAlphaRight(int newTop,int oldTop){
if (newTop > oldTop) {
mCurrentTextAlpha = mCurrentTextAlpha<0 ? 0 : mCurrentTextAlpha;
} else {
mCurrentTextAlpha = mCurrentTextAlpha>255 ? 255 : mCurrentTextAlpha;
}
}
/**
* 主导航条消失或者显示
*/
private void fadeMainNavOnScroll(int newLeft, int newTop, int oldLeft, int oldTop){
//上滑上界
if(newTop >= mMainNavFadeEndScrollTop){
changeMainNavAlpha(1.0f);
mCurrentMainNavAlpha = 1.0f;
return;
}
//下滑下界
if(newTop <= mMainNavFadeBeginScrollTop){
changeMainNavAlpha(0.0f);
mCurrentMainNavAlpha = 0.0f;
return;
}
//上滑下交界
if(mMainNavFadeBeginScrollTop > oldTop && newTop >mMainNavFadeBeginScrollTop){
mCurrentMainNavAlpha = (newTop - mMainNavFadeBeginScrollTop) * mMainNavFadeFactor;
Logger.i("newTop :" + newTop + ",oldTop :" + oldTop + "mCurrentMainNavAlpha :" + mCurrentMainNavAlpha);
ensureFadeMainNavAlphaRight(newTop,oldTop);
changeMainNavAlpha(mCurrentMainNavAlpha);
return;
}
//下滑上交界
if(mMainNavFadeEndScrollTop <oldTop && newTop < mMainNavFadeEndScrollTop){
mCurrentMainNavAlpha = 1.0f - (mMainNavFadeEndScrollTop - newTop)* mMainNavFadeFactor;
ensureFadeMainNavAlphaRight(newTop,oldTop);
changeMainNavAlpha(mCurrentMainNavAlpha);
return;
}
//中间状态
if( mMainNavFadeBeginScrollTop <= oldTop && oldTop <= mMainNavFadeEndScrollTop){
mCurrentMainNavAlpha = mCurrentMainNavAlpha + (newTop - oldTop) * mMainNavFadeFactor;
ensureFadeMainNavAlphaRight(newTop,oldTop);
changeMainNavAlpha(mCurrentMainNavAlpha);
}
}
private void ensureFadeMainNavAlphaRight(int newTop,int oldTop){
if(newTop > oldTop){
mCurrentMainNavAlpha = mCurrentMainNavAlpha > 1? 1: mCurrentMainNavAlpha;
}else{
mCurrentMainNavAlpha = mCurrentMainNavAlpha < 0? 0: mCurrentMainNavAlpha;
}
}
/**
* 缩放首页导航条
*/
private void zoomIndexNavOnScroll(int newLeft, int newTop, int oldLeft, int oldTop){
//上滑上界
if(newTop >= mIndexNavZoomEndScrollTop){
changeIndexNavPadding(mFinalIndexNavPaddingLeft, mFinalIndexNavPaddingRight);
mCurrentIndexNavPaddingLeft = mFinalIndexNavPaddingLeft;
mCurrentIndexNavPaddingRight = mFinalIndexNavPaddingRight;
return;
}
//下滑下界
if(newTop <= mIndexNavZoomBeginScrollTop){
changeIndexNavPadding(0, 0);
mCurrentIndexNavPaddingLeft = 0;
mCurrentIndexNavPaddingRight = 0;
return;
}
//上滑下交界
if( mIndexNavZoomBeginScrollTop > oldTop && newTop > mIndexNavZoomBeginScrollTop){
mCurrentIndexNavPaddingLeft = (int) ((newTop - mIndexNavZoomBeginScrollTop) * mIndexNavMoveLeftFactor);
mCurrentIndexNavPaddingRight = (int) ((newTop - mIndexNavZoomBeginScrollTop) * mIndexNavMoveRightFactor);
ensureIndexNavPaddingRight(newTop, oldTop);
changeIndexNavPadding(mCurrentIndexNavPaddingLeft, mCurrentIndexNavPaddingRight);
return;
}
//下滑上交界
if( mIndexNavZoomBeginScrollTop < oldTop && newTop <mIndexNavZoomBeginScrollTop){
mCurrentIndexNavPaddingLeft = (int) (mFinalIndexNavPaddingLeft - (mIndexNavZoomBeginScrollTop-newTop)*mIndexNavMoveLeftFactor);
mCurrentIndexNavPaddingRight = (int) (mCurrentIndexNavPaddingRight - (mIndexNavZoomBeginScrollTop-newTop)*mIndexNavMoveRightFactor);
ensureIndexNavPaddingRight(newTop, oldTop);
changeIndexNavPadding(mCurrentIndexNavPaddingLeft, mCurrentIndexNavPaddingRight);
return;
}
//中间状态
if( mIndexNavZoomBeginScrollTop <= oldTop && oldTop <= mIndexNavZoomEndScrollTop){
mCurrentIndexNavPaddingLeft = (int) (mCurrentIndexNavPaddingLeft + (newTop - oldTop) * mIndexNavMoveLeftFactor);
mCurrentIndexNavPaddingRight = (int) (mCurrentIndexNavPaddingRight + (newTop - oldTop) * mIndexNavMoveRightFactor);
ensureIndexNavPaddingRight(newTop, oldTop);
changeIndexNavPadding(mCurrentIndexNavPaddingLeft, mCurrentIndexNavPaddingRight);
}
}
private void ensureIndexNavPaddingRight(int newTop, int oldTop){
if(newTop > oldTop){
mCurrentIndexNavPaddingLeft = mCurrentIndexNavPaddingLeft > mFinalIndexNavPaddingLeft? mFinalIndexNavPaddingLeft: mCurrentIndexNavPaddingLeft;
mCurrentIndexNavPaddingRight = mCurrentIndexNavPaddingRight > mFinalIndexNavPaddingRight? mFinalIndexNavPaddingRight: mCurrentIndexNavPaddingRight;
}else{
mCurrentIndexNavPaddingLeft = mCurrentIndexNavPaddingLeft < 0? 0: mCurrentIndexNavPaddingLeft;
mCurrentIndexNavPaddingRight = mCurrentIndexNavPaddingRight < 0? 0: mCurrentIndexNavPaddingRight;
}
}
/**
* 移动主导航栏的元素
*/
private void transferMainNavOnScroll(int newLeft, int newTop, int oldLeft, int oldTop){
//上滑上界
if(newTop >= mMainNavTranEndScrollTop){
mCurrentMNavIndexMarginLeft = 0;
mCurrentMNavMidTGroupMarginTop = 0;
mCurrentMNavRightContainerMarginRight = 0;
setLeftMargin(mMainNavIndexRB, 0);
setTopMargin(mMNavMidRG, 0);
setRightMargin(mMNavRightContainerView, mCurrentMNavRightContainerMarginRight);
return;
}
//下滑下界
if(newTop <= mMainNavTranBeginScrollTop){
mCurrentMNavIndexMarginLeft = mOrginMNavIndexMarginLeft;
mCurrentMNavMidTGroupMarginTop = mOrginMNavMidTGroupMarginTop;
mCurrentMNavRightContainerMarginRight = mOrginMNavRightContainerMarginRight;
setLeftMargin(mMainNavIndexRB, mOrginMNavIndexMarginLeft);
setTopMargin(mMNavMidRG, mOrginMNavMidTGroupMarginTop);
setRightMargin(mMNavRightContainerView, mCurrentMNavRightContainerMarginRight);
return;
}
//上滑下交界
if(mMainNavTranBeginScrollTop > oldTop && newTop > mMainNavTranBeginScrollTop){
mCurrentMNavIndexMarginLeft = (int) (mOrginMNavIndexMarginLeft + (newTop - mMainNavTranBeginScrollTop) * mMNavIndexFactor);
mCurrentMNavMidTGroupMarginTop = (int) (mOrginMNavMidTGroupMarginTop - (newTop - mMainNavTranBeginScrollTop) * mMNavMidTGroupFactor);
mCurrentMNavRightContainerMarginRight = (int) (mOrginMNavRightContainerMarginRight - (newTop - mMainNavTranBeginScrollTop) * mMNavRightContainerFactor);
ensureTransferMainNavRight(newTop, oldTop);
setLeftMargin(mMainNavIndexRB, mCurrentMNavIndexMarginLeft);
setTopMargin(mMNavMidRG, mOrginMNavMidTGroupMarginTop);
setRightMargin(mMNavRightContainerView, mCurrentMNavRightContainerMarginRight);
return;
}
//下滑上交界
if(mMainNavTranEndScrollTop<oldTop && newTop < mMainNavTranEndScrollTop){
mCurrentMNavIndexMarginLeft = (int) ((newTop - mMainNavTranEndScrollTop) * mMNavIndexFactor);
mCurrentMNavMidTGroupMarginTop = (int) ((mMainNavTranEndScrollTop - newTop) * mMNavMidTGroupFactor);
mCurrentMNavRightContainerMarginRight = (int) ((newTop - mMainNavTranEndScrollTop) * mMNavRightContainerFactor);
ensureTransferMainNavRight(newTop, oldTop);
setLeftMargin(mMainNavIndexRB, mCurrentMNavIndexMarginLeft);
setTopMargin(mMNavMidRG, mOrginMNavMidTGroupMarginTop);
setRightMargin(mMNavRightContainerView, mCurrentMNavRightContainerMarginRight);
return;
}
//中间
if( mMainNavTranBeginScrollTop < oldTop && oldTop <= mMainNavTranEndScrollTop){
mCurrentMNavIndexMarginLeft = (int) (mCurrentMNavIndexMarginLeft + (newTop - oldTop) * mMNavIndexFactor);
mCurrentMNavMidTGroupMarginTop = (int) (mCurrentMNavMidTGroupMarginTop - (newTop - oldTop) *mMNavMidTGroupFactor);
mCurrentMNavRightContainerMarginRight = (int) (mCurrentMNavRightContainerMarginRight + (newTop - oldTop) *mMNavRightContainerFactor);
ensureTransferMainNavRight(newTop, oldTop);
setLeftMargin(mMainNavIndexRB, mCurrentMNavIndexMarginLeft);
setTopMargin(mMNavMidRG, mCurrentMNavMidTGroupMarginTop);
setRightMargin(mMNavRightContainerView, mCurrentMNavRightContainerMarginRight);
}
}
private void ensureTransferMainNavRight(int newTop, int oldTop){
if(newTop > oldTop){
mCurrentMNavIndexMarginLeft = mCurrentMNavIndexMarginLeft > 0? 0: mCurrentMNavIndexMarginLeft;
mCurrentMNavRightContainerMarginRight = mCurrentMNavRightContainerMarginRight >0 ? 0 :mCurrentMNavRightContainerMarginRight;
mCurrentMNavMidTGroupMarginTop = mCurrentMNavMidTGroupMarginTop < 0? 0: mCurrentMNavMidTGroupMarginTop;
}else{
mCurrentMNavIndexMarginLeft = mCurrentMNavIndexMarginLeft < mOrginMNavIndexMarginLeft ? mOrginMNavIndexMarginLeft : mCurrentMNavIndexMarginLeft;
mCurrentMNavRightContainerMarginRight = mCurrentMNavRightContainerMarginRight < mOrginMNavRightContainerMarginRight ? mOrginMNavRightContainerMarginRight : mCurrentMNavRightContainerMarginRight;
mCurrentMNavMidTGroupMarginTop = mCurrentMNavMidTGroupMarginTop > mOrginMNavMidTGroupMarginTop ? mOrginMNavMidTGroupMarginTop : mCurrentMNavMidTGroupMarginTop;
}
}
private void changeIndexNavTextAlpha(int alpha){
setViewTextAlpha(mIndexNavDiscoverTV,alpha);
setViewTextAlpha(mIndexNavBlogTV,alpha);
setViewTextAlpha(mIndexNavMineTV,alpha);
setViewTextAlpha(mIndexNavMoreTV,alpha);
}
private void changeMainNavAlpha(float alpha){
setViewAlpha(mMainNavView, alpha);
}
private void changeIndexNavPadding(int paddingLeft, int paddingRight){
mIndexHeaderNavView.setPadding(paddingLeft, mIndexHeaderNavView.getPaddingTop(), paddingRight, mIndexHeaderNavView.getPaddingBottom());
}
private void setViewTextAlpha(TextView v ,int alpha){
ColorStateList colorStateList = v.getTextColors();
v.setTextColor(colorStateList.withAlpha(alpha));
}
@SuppressLint("NewApi")
private void setViewAlpha(View v, float alpha){
if(android.os.Build.VERSION.SDK_INT >= 11){
v.setAlpha(alpha);
}else{
AlphaAnimation alphaAnim = new AlphaAnimation(alpha, alpha);
alphaAnim.setDuration(0);
alphaAnim.setFillAfter(true);
v.startAnimation(alphaAnim);
}
}
private void setLeftMargin(View v, int leftMargin){
RelativeLayout.LayoutParams lp = (android.widget.RelativeLayout.LayoutParams) v.getLayoutParams();
lp.leftMargin = leftMargin;
v.setLayoutParams(lp);
}
private void setTopMargin(View v, int topMargin){
RelativeLayout.LayoutParams lp = (android.widget.RelativeLayout.LayoutParams) v.getLayoutParams();
lp.topMargin = topMargin;
v.setLayoutParams(lp);
}
private void setRightMargin(View v, int rightMargin){
RelativeLayout.LayoutParams lp = (android.widget.RelativeLayout.LayoutParams) v.getLayoutParams();
lp.rightMargin = rightMargin;
v.setLayoutParams(lp);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP){
mHandler.removeMessages(MSG_PULL_RECOVER);
mHandler.sendEmptyMessageDelayed(MSG_PULL_RECOVER, 200);
}
return false;
}
private void showMainNav(){
fadeTextOnScroll(0, mMaxScrollTop, 0, mMaxScrollTop);
fadeMainNavOnScroll(0, mMaxScrollTop, 0, mMaxScrollTop);
zoomIndexNavOnScroll(0, mMaxScrollTop, 0, mMaxScrollTop);
transferMainNavOnScroll(0, mMaxScrollTop, 0, mMaxScrollTop);
mMainSV.scrollTo(0, mMaxScrollTop);
}
private void hideMainNav(){
fadeTextOnScroll(0, 0, 0, 0);
fadeMainNavOnScroll(0, 0, 0, 0);
zoomIndexNavOnScroll(0, 0, 0, 0);
transferMainNavOnScroll(0, 0, 0, 0);
mMainSV.scrollTo(0, 0);
}
private void pullRecover() {
int upY = mMainSV.getScrollY();
int divideScrollY = mMaxScrollTop /2;
if(upY<= divideScrollY){
hideMainNav();
}else if(upY < mMaxScrollTop){
showMainNav();
}
}
private static final class InnerHandler extends Handler {
private WeakReference<ImitateWandoujiaActivity> mActivityWR;
public InnerHandler(ImitateWandoujiaActivity theActivity) {
mActivityWR = new WeakReference<>(theActivity);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_PULL_RECOVER:
ImitateWandoujiaActivity theActivity = mActivityWR.get();
if (theActivity == null) return;
theActivity.pullRecover();
break;
}
}
}
}