package com.example.ipcplayer.index; import java.util.ArrayList; import java.util.List; import com.example.ipcplayer.R; import android.app.Activity; import android.content.Context; import android.util.AttributeSet; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; /** * 自定义view------字母索引bar zds 3.21 */ public class AlphabetIndexBar extends LinearLayout { private Context mContext = null; public final int ORIENTATION = LinearLayout.VERTICAL; private LinearLayout mLayoutIndex = null; private AlphabetIndexView[] mIndexViews = null; private AlphabetIndexView mCurrentView = null; private AlphabetIndexView mPreviousView = null; private ArrayList<OnAlphabetIndexBar> mCallbackList = null; public AlphabetIndexBar(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = context; setContentView(); setupViews(); } /** * setContentView * * @param layoutId * @param lp */ public void setContentView() { LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); LinearLayout layout = (LinearLayout) ((Activity) mContext) .getLayoutInflater().inflate(R.layout.alphabetindexbar, null); lp.gravity = Gravity.CENTER; this.addView(layout, lp); } /** * setupViews */ private void setupViews() { mLayoutIndex = (LinearLayout) this.findViewById(R.id.layout_index); mLayoutIndex.setOrientation(ORIENTATION); mLayoutIndex.setOnTouchListener(layoutIndexTouchListener); } /** * initialization * * @param weights */ public void initialization(List<String> tags) { final int length = tags.size(); mLayoutIndex.removeAllViews(); mIndexViews = new AlphabetIndexView[length]; LinearLayout.LayoutParams lp = null; for (int i = 0; i < length; i++) { AlphabetIndexView indexView = new AlphabetIndexView(mContext, tags.get(i)); lp = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); lp.weight = 1; lp.gravity = Gravity.CENTER; mLayoutIndex.addView(indexView, lp); mIndexViews[i] = indexView; } } /** * setCurrentItem * * @param currentTag */ public void setCurrentItem(String currentTag) { if (!isShown()) return; // 相同的不处理 if (mCurrentView != null) { String temp = mCurrentView.getTagText(); if (currentTag != null && currentTag.equals(temp)) { return; } } if (mIndexViews == null) return; int length = mIndexViews.length; AlphabetIndexView indexView = null; // 找到tag对应的indexview for (int i = 0; i < length; i++) { indexView = mIndexViews[i]; String tag = indexView.getTagText(); if (tag != null && currentTag.equals(tag)) { break; } } if (indexView == null) { return; } mPreviousView = mCurrentView; mCurrentView = indexView; if (mPreviousView != null) mPreviousView.setNormalColor(); if (mCurrentView != null) mCurrentView.setSelectedColor(); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); resetIndex(); } private OnTouchListener layoutIndexTouchListener = new RelativeLayout.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { final int touchX = (int) event.getX(); final int touchY = (int) event.getY(); AlphabetIndexView indexView = getIndexView(touchX, touchY); indexView = (indexView == null) ? mCurrentView : indexView; if (indexView != null) { onIndexBarTouch(indexView, event); if (indexView != mCurrentView) { // 回调 onIndexChange(indexView); // 设置选中颜色 setCurrentItem(indexView.getTagText()); } // do nothing now... switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; case MotionEvent.ACTION_OUTSIDE: break; } } return true; } }; /** * getIndexView * * @param index * @return */ private AlphabetIndexView getIndexView(int index) { AlphabetIndexView ret = null; if(mIndexViews == null) return ret ; int length = mIndexViews.length; for (int i = 0; i < length; i++) { AlphabetIndexView indexView = mIndexViews[i]; if (indexView.getIndex() == index) { ret = indexView; break; } } return ret; } /** * getIndexView * * @param x * @param y * @return */ @SuppressWarnings("unused") private AlphabetIndexView getIndexView(float touchX, float touchY) { AlphabetIndexView ret = null; if(mIndexViews == null) return ret ; int length = mIndexViews.length; for (int i = 0; i < length; i++) { AlphabetIndexView indexView = mIndexViews[i]; if(indexView == null) continue; if (ORIENTATION == LinearLayout.HORIZONTAL) { if ((indexView.getIndex() - indexView.getWidth() / 2) <= touchX && touchX < (indexView.getIndex() + indexView .getWidth() / 2)) { ret = indexView; break; } } else if (ORIENTATION == LinearLayout.VERTICAL) { if ((indexView.getIndex() - indexView.getHeight() / 2) <= touchY && touchY < (indexView.getIndex() + indexView .getHeight() / 2)) { ret = indexView; break; } } } return ret; } public AlphabetIndexView[] getIndexViews() { return mIndexViews; } /** * resetIndex */ @SuppressWarnings("unused") public void resetIndex() { if (mIndexViews == null) return; final int length = mIndexViews.length; int margin = 0; for (int i = 0; i < length; i++) { if (ORIENTATION == LinearLayout.HORIZONTAL) { margin += mIndexViews[i].getWidth(); mIndexViews[i].setIndex(margin - mIndexViews[i].getWidth() / 2); } else if (ORIENTATION == LinearLayout.VERTICAL) { margin += mIndexViews[i].getHeight(); mIndexViews[i] .setIndex(margin - mIndexViews[i].getHeight() / 2); } } } public void onTouch(MotionEvent event) { if(!isShown()) return; if (layoutIndexTouchListener != null) { layoutIndexTouchListener.onTouch(this, event); } } // ////////////////////////////////////////////////////////////////////////////////// // // interface // 字母索引bar回调 // zds // // ////////////////////////////////////////////////////////////////////////////////// public interface OnAlphabetIndexBar { void onIndexBarTouch(AlphabetIndexView indexView, MotionEvent event); void onIndexChange(AlphabetIndexView indexView); }; public boolean registerCallback(OnAlphabetIndexBar callback) { boolean ret = false; if (mCallbackList == null) { mCallbackList = new ArrayList<OnAlphabetIndexBar>(); } ret = mCallbackList.add(callback); return ret; } public boolean unregisterCallback(OnAlphabetIndexBar callback) { boolean ret = false; if (mCallbackList != null) { ret = mCallbackList.remove(mCallbackList); } return ret; } private void onIndexBarTouch(AlphabetIndexView indexView, MotionEvent event) { if (mCallbackList != null) { int size = mCallbackList.size(); for (int i = 0; i < size; i++) { mCallbackList.get(i).onIndexBarTouch(indexView, event); } } } private void onIndexChange(AlphabetIndexView indexView) { if (mCallbackList != null) { int size = mCallbackList.size(); for (int i = 0; i < size; i++) { mCallbackList.get(i).onIndexChange(indexView); } } } }