package com.quick.library;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
import com.quick.library.app.R;
import android.content.Context;
import android.content.res.Resources;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
* 页面切换标签控件基类
*
* @author savant-pan
*
*/
public class QuickTabView extends LinearLayout implements View.OnTouchListener {
private LinearLayout tabHost;
private List<View> viewList = new Vector<View>();
/**
* 界面刷新Handler
*/
private Handler refreshHandler;
private int viewCount = 0;
private int currentIndex = 0;
private OnIndicateChangeListener onIndicateChangeListener;
private boolean notify = false;
/**
* 标签切换监听接口
*/
public interface OnIndicateChangeListener {
public void onTabChanged(int position);
}
public QuickTabView(Context context) {
super(context);
this.init();
}
public QuickTabView(Context context, AttributeSet attrs) {
super(context, attrs);
this.init();
}
private void init() {
LayoutInflater.from(getContext()).inflate(R.layout.quick_tab_view_layout, this);
this.tabHost = (LinearLayout) findViewById(R.id.tab_host);
this.refreshHandler = new TabIndicateHandler(QuickTabView.this);
}
public void setOnIndicateChangeListener(OnIndicateChangeListener onIndicateChangeListener) {
if (onIndicateChangeListener == null) {
throw new NullPointerException();
}
this.onIndicateChangeListener = onIndicateChangeListener;
}
/**
* 设置文字标签数据
*
* @param titleArray
* 文字标签数组
*/
public void setupLayout(String titleArray[]) {
if (titleArray == null || titleArray.length == 0) {
throw new NullPointerException();
}
this.setupLayout(Arrays.asList(titleArray));
}
/**
* 设置文字标签数据
*
* @param titleList
* 文字标签列表
*/
public void setupLayout(List<String> textList) {
if (textList == null || textList.size() == 0) {
throw new NullPointerException();
}
final int len = textList.size();
final List<View> list = new ArrayList<View>();
for (int index = 0; index < len; index++) {
final View view = LayoutInflater.from(getContext()).inflate(R.layout.quick_tab_view_item, null);
final TextView textView = (TextView) view.findViewById(R.id.indicator_text);
textView.setText(textList.get(index));
list.add(view);
}
this.setupTabLayout(list);
}
protected void setupTabLayout(List<View> list) {
if (list == null || list.size() == 0) {
throw new NullPointerException();
}
this.viewCount = list.size();
final LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
final LayoutParams linelp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
linelp.gravity = Gravity.CENTER_VERTICAL;
lp.weight = 1f / viewCount;
for (int index = 0; index < viewCount; index++) {
final View view = list.get(index);
this.tabHost.addView(view, lp);
if (index != viewCount - 1) {
final View lineView = LayoutInflater.from(getContext()).inflate(R.layout.quick_tab_view_line, null);
this.tabHost.addView(lineView, linelp);
}
view.setOnTouchListener(this);
this.viewList.add(view);
}
this.refrash();
}
/**
* 设置当前显示TAB
*
* @param position
* 前显示TAB位置
*/
public void setCurrentTab(int position) {
this.setCurrentTab(position, true);// 默认需要通知接口返回位置
}
/**
* 设置当前显示TAB
*
* @param position
* 前显示TAB位置
* @param notify
* 是否通知接口返回位置
*/
public void setCurrentTab(int position, boolean notify) {
this.notify = notify;
this.currentIndex = position;
this.refrash();
}
/**
* 事件处理
*/
@Override
public boolean onTouch(View view, MotionEvent event) {
final View lastView = this.viewList.get(this.currentIndex);
if (lastView != view) {
this.setCurrentIndex(view);
this.refrash();
return false;
} else {
return true;
}
}
/**
* 设置当前 currentIndex值
*
* @param touchView
*/
private void setCurrentIndex(View touchView) {
for (int index = 0; index < this.viewCount; index++) {// 切换刷新界面
final View view = this.viewList.get(index);
if (touchView == view) {
this.currentIndex = index;
}
}
}
/**
* 更新条目
*/
private void refrash() {
this.refreshHandler.sendEmptyMessage(0);
}
protected void refreshIndicateView() {
for (int index = 0; index < viewCount; index++) {// 切换刷新界面
final View view = viewList.get(index);
if (index == currentIndex) {
refreshItemView(view, true);
if (onIndicateChangeListener != null) {
if (!notify) {// use only once
notify = true;
} else {
onIndicateChangeListener.onTabChanged(index);
}
}
} else {
refreshItemView(view, false);
}
}
}
/**
* 更新选中项,重写则自定义
*
* @param view
* @param isLast
*/
protected void refreshItemView(View view, boolean isCurrent) {
final View line = view.findViewById(R.id.bottom_line);
final TextView textView = (TextView) view.findViewById(R.id.indicator_text);
final Resources resources = getContext().getResources();
if (isCurrent) {
textView.setTextColor(resources.getColor(R.color.quick_frame));
line.setVisibility(View.VISIBLE);
} else {
textView.setTextColor(resources.getColor(R.color.quick_title));
line.setVisibility(View.INVISIBLE);
}
}
}
class TabIndicateHandler extends Handler {
private QuickTabView absTabIndicateView;
public TabIndicateHandler(QuickTabView absTabIndicateView) {
this.absTabIndicateView = absTabIndicateView;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (this.absTabIndicateView != null) {
this.absTabIndicateView.refreshIndicateView();
}
}
}