android中的索引列表

一.定義控件
首先定義一個列表側邊的字母索引項控件
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:
                      setBackgroundDrawable( new ColorDrawable(0x00000000));
                      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);
       }

}

二.使用
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章