package com.itap.voiceemoticon.widget;
import com.itap.voiceemoticon.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.Adapter;
import android.widget.HeaderViewListAdapter;
import android.widget.ListView;
import android.widget.SectionIndexer;
import android.widget.TextView;
public class SegmentBar extends View {
private char[] mCharArr = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '?'
};
private SectionIndexer mSectionIndexter = null;
private TextView mDialogText;
private ListView mListView;
private Bitmap mbitmap;
private int mType = 1;
private int mColor = 0xff858c94;
private int mBgColor = 0xFFDDDDDD;
private int mCurrentSelectIndex = -1;
private int mLastSelectIndex = -1;
private WindowManager mWindowManager = null;
public SegmentBar(Context context) {
super(context);
init();
}
public void setCurrentSection(char setctionLetter) {
setctionLetter = Character.toUpperCase(setctionLetter);
for (int i = 0, len = mCharArr.length; i < len; i++) {
if (setctionLetter == mCharArr[i]) {
mCurrentSelectIndex = i;
postInvalidate();
break;
}
}
}
public SegmentBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SegmentBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public void setListView(ListView listView) {
mListView = listView;
Adapter adapter = listView.getAdapter();
try {
if (adapter instanceof SectionIndexer) {
mSectionIndexter = (SectionIndexer)adapter;
} else {
adapter = ((HeaderViewListAdapter)adapter).getWrappedAdapter();
mSectionIndexter = (SectionIndexer)adapter;
}
} catch (Exception e) {
e.printStackTrace();
}
}
private WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
private void init() {
mbitmap = BitmapFactory.decodeResource(getResources(), android.R.drawable.ic_menu_search);
mWindowManager = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
// Window LayoutParams
int size = getResources().getDimensionPixelSize(R.dimen.tp_section_indexer_tip_size);
lp.width = size;
lp.height = size;
// Dialog Text
createDialogText();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
System.out.println("onAttachedToWindow");
mWindowManager.addView(mDialogText, lp);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
System.out.println("onDetachedFromWindow");
removeDialogText();
}
private void createDialogText() {
if (null != mDialogText ) {
return;
}
mDialogText = new TextView(getContext());
mDialogText.setTextColor(Color.WHITE);
mDialogText.setGravity(Gravity.CENTER);
mDialogText.setVisibility(View.INVISIBLE);
int textSize = getResources().getDimensionPixelSize(
R.dimen.tp_section_indexer_tip_text_size);
mDialogText.setTextSize(textSize);
mDialogText.setBackgroundResource(R.drawable.chatfrom_bg_voiceforward_pressed);
}
private void removeDialogText() {
if (mDialogText.getParent() != null) {
mWindowManager.removeView(mDialogText);
}
}
public void setTextView(TextView mDialogText) {
this.mDialogText = mDialogText;
}
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
int eventY = (int)event.getY();
int idx = eventY / (getMeasuredHeight() / mCharArr.length);
if (idx >= mCharArr.length) {
idx = mCharArr.length - 1;
} else if (idx < 0) {
idx = 0;
}
mLastSelectIndex = mCurrentSelectIndex;
mCurrentSelectIndex = idx;
if (event.getAction() == MotionEvent.ACTION_DOWN
|| event.getAction() == MotionEvent.ACTION_MOVE) {
setBackgroundColor(0xFFFFFFFF);
if (mSectionIndexter == null) {
mSectionIndexter = (SectionIndexer)mListView.getAdapter();
}
int position = mSectionIndexter.getPositionForSection(mCharArr[idx]);
if (position == -1) {
return true;
} else {
mDialogText.setVisibility(View.VISIBLE);
mDialogText.setText(String.valueOf(mCharArr[idx]));
}
mListView.setSelection(position);
} else {
mDialogText.setVisibility(View.INVISIBLE);
}
if (event.getAction() == MotionEvent.ACTION_UP) {
if (mLastSelectIndex != mCurrentSelectIndex) {
this.invalidate();
}
setBackgroundDrawable(new ColorDrawable(0x00000000));
}
return true;
}
public float getFontHeight(Paint paint) {
Rect bounds = new Rect();
paint.getTextBounds("A", 0, 1, bounds);
return bounds.height();
}
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(mColor);
paint.setTextAlign(Align.CENTER);
final int width = getMeasuredWidth();
int x = width / 2;
int y = 0;
int textBaseLine = y;
if (mCharArr.length > 0) {
float height = getMeasuredHeight() / (mCharArr.length);
paint.setTextSize(height - 2);
float fontHeight = getFontHeight(paint);
for (int i = 0; i < mCharArr.length; i++) {
y = (int)(i * height);
textBaseLine = (int)(y + height);
if (mCurrentSelectIndex == i) {
Rect rect = new Rect();
rect.set(0, y, 0 + width, y + (int)height);
Paint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
bgPaint.setColor(mBgColor);
bgPaint.setStyle(Style.FILL);
canvas.drawRect(rect, bgPaint);
}
canvas.drawText(String.valueOf(mCharArr[i]), x, textBaseLine
- ((height - fontHeight) / 2), paint);
}
}
super.onDraw(canvas);
}
}