android中的索引列表
一.定義控件
首先定義一個列表側邊的字母索引項控件
setBackgroundDrawable(
new
ColorDrawable(0x00000000));
package
com.shjy.jingin.ui;
import
com.shjy.jingin.R;
import
android.content.Context;
import
android.graphics.Canvas;
import
android.graphics.Color;
import
android.graphics.Paint;
import
android.graphics.Typeface;
import
android.graphics.drawable.ColorDrawable;
import
android.util.AttributeSet;
import
android.view.MotionEvent;
import
android.view.View;
import
android.widget.TextView;
public
class
SideBar
extends
View {
// 觸摸事件
private
OnTouchingLetterChangedListener
onTouchingLetterChangedListener
;
// 26個字母
public
static
String[]
b
= {
"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
int
choose
= -1;// 選中
private
Paint
paint
=
new
Paint();
private
TextView
mTextDialog
;
/**
* 爲SideBar設置顯示字母的TextView
*
@param
mTextDialog
*/
public
void
setTextView(TextView mTextDialog) {
this.mTextDialog
= mTextDialog;
}
public
SideBar(Context context, AttributeSet attrs,
int
defStyle) {
super(context, attrs, defStyle);
}
public
SideBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public
SideBar(Context context) {
super(context);
}
/**
* 重寫這個方法
*/
protected
void
onDraw(Canvas canvas) {
super.onDraw(canvas);
// 獲取焦點改變背景顏色.
int
height = getHeight();// 獲取對應高度
int
width = getWidth();
// 獲取對應寬度
int
singleHeight = height /
b.length;//
獲取每一個字母的高度
for
(int
i = 0; i <
b.length;
i++) {
paint.setColor(Color.
rgb(33, 65, 98));
// paint.setColor(Color.WHITE);
paint.setTypeface(Typeface.
DEFAULT_BOLD);
paint.setAntiAlias(
true);
paint.setTextSize(20);
// 選中的狀態
if
(i ==
choose
) {
paint.setColor(Color.
parseColor("#3399ff"));
paint.setFakeBoldText(
true);
}
// x座標等於中間-字符串寬度的一半.
float
xPos = width / 2 -
paint
.measureText(b[i])
/ 2;
float
yPos = singleHeight * i + singleHeight;
canvas.drawText(
b[i], xPos, yPos,
paint);
paint.reset();
// 重置畫筆
}
}
@Override
public
boolean
dispatchTouchEvent(MotionEvent event) {
final
int
action = event.getAction();
final
float
y = event.getY();// 點擊y座標
final
int
oldChoose =
choose;
final
OnTouchingLetterChangedListener listener =
onTouchingLetterChangedListener
;
final
int
c = (int)
(y / getHeight() *
b.length);//
點擊y座標所佔總高度的比例*b數組的長度就等於點擊b中的個數.
switch
(action) {
case
MotionEvent.ACTION_UP:
choose
= -1;
//
invalidate();
if
(mTextDialog
!=
null) {
mTextDialog.setVisibility(View.INVISIBLE);
}
break;
default:
setBackgroundResource(R.drawable.
sidebar_background);
if
(oldChoose != c) {
if
(c >= 0 && c <
b.length)
{
if
(listener !=
null) {
listener.onTouchingLetterChanged(
b[c]);
}
if
(mTextDialog
!=
null) {
mTextDialog.setText(b
[c]);
mTextDialog.setVisibility(View.VISIBLE);
}
choose
= c;
invalidate();
}
}
break;
}
return
true
;
}
/**
* 向外公開的方法
*
*
@param
onTouchingLetterChangedListener
*/
public
void
setOnTouchingLetterChangedListener(
OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
this.onTouchingLetterChangedListener
= onTouchingLetterChangedListener;
}
/**
* 接口
*
*
@author
coder
*
*/
public
interface
OnTouchingLetterChangedListener {
public
void
onTouchingLetterChanged(String s);
}
}
二.使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.