这里直接贴代码,mListViewListener用来在滑动的时候发消息给handler显示控件。doOnScrollStateChange()用于在listView停止滑动时,发消息给Handler隐藏控件。
protected void doOnScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
super.doOnScrollStateChanged(view, scrollState);
if(MusicUtils.sGnGiFlag){
switch(scrollState){
case OnScrollListener.SCROLL_STATE_IDLE:
isScrolling = false;
if(!isTouchOnListView){
Message msg = Message.obtain();
msg.what = MSG_DISMISS_INDEXVIEW;
mIndexViewVisibilityHandler.sendMessageDelayed(msg, INDEXVIEW_SHOW_LAST_TIME);
}else{
mIndexViewVisibilityHandler.removeCallbacksAndMessages(null);
}
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
isScrolling = true;
break;
}
}
}
private static final int MSG_DISMISS_INDEXVIEW = 0;
private static final int MSG_SHOW_INDEXVIEW = 1;
Handler mIndexViewVisibilityHandler = new Handler(Looper.getMainLooper()){
int animationDuration = 500;
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what){
case MSG_DISMISS_INDEXVIEW:
if(mAmigoAlphabetIndexView.getVisibility() != View.VISIBLE)
return;
AlphaAnimation dismissAlphaAnimation = new AlphaAnimation(mAmigoAlphabetIndexView.getAlpha(), 0);
dismissAlphaAnimation.setDuration(animationDuration);
dismissAlphaAnimation.setAnimationListener(new AnimationListener(){
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
mAmigoAlphabetIndexView.setAlpha(0);
mAmigoAlphabetIndexView.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
});
mAmigoAlphabetIndexView.clearAnimation();
mAmigoAlphabetIndexView.startAnimation(dismissAlphaAnimation);
break;
case MSG_SHOW_INDEXVIEW:
LogUtil.i(TAG, "MSG_SHOW_INDEXVIEW");
if(!getIsShowIndexer())
return;
AlphaAnimation showAlphaAnimation;
if(mAmigoAlphabetIndexView.getVisibility() == View.VISIBLE){
showAlphaAnimation = new AlphaAnimation(mAmigoAlphabetIndexView.getAlpha(), 1);
showAlphaAnimation.setDuration((long)((1-mAmigoAlphabetIndexView.getAlpha())*animationDuration));
}else{
showAlphaAnimation = new AlphaAnimation(0, 1);
showAlphaAnimation.setDuration(animationDuration);
}
showAlphaAnimation.setAnimationListener(new AnimationListener(){
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
mAmigoAlphabetIndexView.setVisibility(View.VISIBLE);
mAmigoAlphabetIndexView.setAlpha(1);
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
});
mAmigoAlphabetIndexView.clearAnimation();
mAmigoAlphabetIndexView.startAnimation(showAlphaAnimation);
break;
}
}
};
private boolean isTouchOnListView = false;
private boolean isScrolling = false;
OnTouchListener mListViewListener = new View.OnTouchListener() {
int minYDistance = 40;
float startY = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(mAmigoAlphabetIndexView.getVisibility() == View.INVISIBLE && MotionEvent.ACTION_MOVE == event.getAction()){
if(Math.abs(event.getRawY() - startY) > minYDistance){
mIndexViewVisibilityHandler.removeCallbacksAndMessages(null);
mIndexViewVisibilityHandler.sendEmptyMessage(MSG_SHOW_INDEXVIEW);
}
}else if(MotionEvent.ACTION_DOWN == event.getAction()){
startY = event.getRawY();
isTouchOnListView = true;
}else if(MotionEvent.ACTION_UP == event.getAction()){
isTouchOnListView = false;
if(!isScrolling){
Message msg = Message.obtain();
msg.what = MSG_DISMISS_INDEXVIEW;
mIndexViewVisibilityHandler.sendMessageDelayed(msg, INDEXVIEW_SHOW_LAST_TIME);
}else{
mIndexViewVisibilityHandler.removeCallbacksAndMessages(null);
}
}
return false;
}
};