Android-自定義索引表view

主要步驟
1.橫向繪制出26個字母和#
2.事件滑動獲取對應(yīng)的字母
3.監(jiān)聽回調(diào)出對應(yīng)字母
public class SideBar  extends View{
private static final String TAG = "SideBar";
private static String minue="A";
/**
 * 觸摸事件
 */
private ITouchingLetterChangedListener onTouchingLetterChangedListener;
/**
 * 側(cè)邊欄顯示字母
 */
private String[] words = { "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 int chooseup=-1;
/**
 * 相應(yīng)的畫筆
 */
private Paint paint;

/**
 * 構(gòu)造函數(shù) 數(shù)據(jù)初始化
 * @param context 上下文對象
 * @param attrs   屬性列表
 * @param defStyleAttr 默認(rèn)樣式
 */
public SideBar(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}
/**
 * 初始化相應(yīng)的數(shù)據(jù)
 */
private void init() {
    paint = new Paint();
}
/**
 * 構(gòu)造函數(shù) 數(shù)據(jù)初始化
 * @param context 上下文對象
 * @param attrs  屬性列表
 */
public SideBar(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

/**
 * 構(gòu)造函數(shù) 數(shù)據(jù)初始化
 * @param context  上下文對象
 */
public SideBar(Context context) {
    this(context, null);
}

/**
 * 繪制列表控件的方法
 * 將要繪制的字母以從上到下的順序繪制在一個指定區(qū)域
 * 如果是進行選中的字母就進行高亮顯示
 */
@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    int height = getHeight();// 獲取對應(yīng)高度
    int width = getWidth(); // 獲取對應(yīng)寬度
    int singleWidth = width / words.length;// 獲取每一個字母的寬度

    for (int i = 0; i < words.length; i++) {
        paint.setColor(getResources().getColor(R.color.indexadc));
        // paint.setColor(Color.WHITE);
        paint.setTypeface(Typeface.DEFAULT_BOLD);

        paint.setTextSize(20f);
        // 選中的狀態(tài)
        if (i == choose) {
            chooseup=choose;
            paint.setColor(getResources().getColor(R.color.indexabc));
            paint.setFakeBoldText(true);
        }
        // x坐標(biāo)等于中間-字符串寬度的一半.
        //float yPos = height / 2.0f - paint.measureText(words[i]) / 2.0f;
        float yPos = height / 2.0f - paint.measureText(words[0]) / 2.0f;
        float xPos = singleWidth * i + singleWidth/2;
        if (words[i]=="I") {  //解決當(dāng)繪制字母I時會左右距離不同問題
            xPos = singleWidth * i + singleWidth/2+paint.measureText(words[0]) / 2.0f;
        }
        canvas.drawText(words[i], xPos, yPos, paint);
        paint.reset();// 重置畫筆
    }
}
boolean isup=false;

/**
 * 處理觸摸事件的方法
 * 用戶按下時候,整個控件背景變化
 * 根據(jù)按下x坐標(biāo) 判斷究竟用戶按下那個字母
 * 當(dāng)前字母高亮顯示 將其字母顯示屏幕中央
 */
@SuppressWarnings("deprecation")
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    int action = event.getAction();
    final float x = event.getX();// 點擊x坐標(biāo)
    final int oldChoose = choose;
    final ITouchingLetterChangedListener listener = onTouchingLetterChangedListener;
    final int c = (int) (x / getWidth() * words.length);// 點擊x坐標(biāo)所占總寬度的比例*b數(shù)組的長度就等于點擊b中的個數(shù).
    switch (action) {

    case MotionEvent.ACTION_UP:
        isup=true;
        FragmentContacts.hideADCtip();
        setBackgroundDrawable(new ColorDrawable(0x00000000));
        choose = -1;//
        invalidate();
        break;

    default:
        isup=false;
        //setBackgroundResource(R.drawable.sidebar_background);
        if (oldChoose != c) {
            if (c >= 0 && c < words.length) {
                if (listener != null) {
                    listener.OnTouchingLetterChanged(words[c]);
                }
                choose = c;
                invalidate();
            }
        }
        break;
    }
    return true;
}


//listView滑動可見第一個字母
public void setPosition(String position){
    Log.i(TAG, "position"+position);
    //isshow=true;
    minue=position;
}

/**
 * 接口
 */
public interface ITouchingLetterChangedListener {
    void OnTouchingLetterChanged(String cString);
}

/**
 * 字母改變的監(jiān)聽器
 * @return  獲取字母改變的監(jiān)聽器
 */
public ITouchingLetterChangedListener getOnTouchingLetterChangedListener() {
    return onTouchingLetterChangedListener;
}

/**
 * 設(shè)置改變的監(jiān)聽器
 * @param onTouchingLetterChangedListener 設(shè)置字母改變的監(jiān)聽器
 */
public void setOnTouchingLetterChangedListener(
        ITouchingLetterChangedListener onTouchingLetterChangedListener) {
    this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
}

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子划提,更是在濱河造成了極大的恐慌唠帝,老刑警劉巖拱烁,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件籽懦,死亡現(xiàn)場離奇詭異,居然都是意外死亡镐作,警方通過查閱死者的電腦和手機藏姐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來该贾,“玉大人羔杨,你說我怎么就攤上這事⊙畹埃” “怎么了兜材?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逞力。 經(jīng)常有香客問我曙寡,道長,這世上最難降的妖魔是什么寇荧? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任举庶,我火速辦了婚禮,結(jié)果婚禮上砚亭,老公的妹妹穿的比我還像新娘灯变。我一直安慰自己,他們只是感情好捅膘,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布添祸。 她就那樣靜靜地躺著,像睡著了一般寻仗。 火紅的嫁衣襯著肌膚如雪刃泌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天署尤,我揣著相機與錄音耙替,去河邊找鬼。 笑死曹体,一個胖子當(dāng)著我的面吹牛俗扇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箕别,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铜幽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了串稀?” 一聲冷哼從身側(cè)響起除抛,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎母截,沒想到半個月后到忽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡清寇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年喘漏,在試婚紗的時候發(fā)現(xiàn)自己被綠了护蝶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡翩迈,死狀恐怖滓走,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帽馋,我是刑警寧澤搅方,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站绽族,受9級特大地震影響姨涡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吧慢,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一涛漂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧检诗,春花似錦匈仗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至攻泼,卻和暖如春火架,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忙菠。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工何鸡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牛欢。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓骡男,卻偏偏與公主長得像,于是被迫代替她去往敵國和親傍睹。 傳聞我的和親對象是個殘疾皇子隔盛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容