Android 개발 의 사용자 정의 view 주소록 목록 A~Z 알파벳 알림 효과 구현[데모 원본 다운로드 첨부]

6228 단어 Android통신 록
이 사례 는 안 드 로 이 드 개발 의 사용자 정의 view 가 주소록 목록 A~Z 자모 알림 효 과 를 실현 하 는 것 을 보 여 준다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
개발 도구:eclipse
실행 환경:htc G9 android 2.3.3
말 이 많 지 않 으 니,먼저 효과 도 를 보아 라.


사실 좌우 에 있 는 A~Z 는 사용자 정의 View 로 ListView 에 직접 덮어 씁 니 다.
MyLetterListView:

public class MyLetterListView extends View {
  OnTouchingLetterChangedListener onTouchingLetterChangedListener;
  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"};
  int choose = -1;
  Paint paint = new Paint();
  boolean showBkg = false;
  public MyLetterListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }
  public MyLetterListView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
  public MyLetterListView(Context context) {
    super(context);
  }
  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if(showBkg){
      canvas.drawColor(Color.parseColor("#40000000"));
    }
    int height = getHeight();
    int width = getWidth();
    int singleHeight = height / b.length;
    for(int i=0;i<b.length;i++){
      paint.setColor(Color.WHITE);
      paint.setTypeface(Typeface.DEFAULT_BOLD);
      paint.setAntiAlias(true);
      if(i == choose){
        paint.setColor(Color.parseColor("#3399ff"));
        paint.setFakeBoldText(true);
      }
      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();
    final int oldChoose = choose;
    final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
    final int c = (int) (y/getHeight()*b.length);
    switch (action) {
      case MotionEvent.ACTION_DOWN:
        showBkg = true;
        if(oldChoose != c && listener != null){
          if(c > 0 && c< b.length){
            listener.onTouchingLetterChanged(b[c]);
            choose = c;
            invalidate();
          }
        }
        break;
      case MotionEvent.ACTION_MOVE:
        if(oldChoose != c && listener != null){
          if(c > 0 && c< b.length){
            listener.onTouchingLetterChanged(b[c]);
            choose = c;
            invalidate();
          }
        }
        break;
      case MotionEvent.ACTION_UP:
        showBkg = false;
        choose = -1;
        invalidate();
        break;
    }
    return true;
  }
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    return super.onTouchEvent(event);
  }
  public void setOnTouchingLetterChangedListener(
      OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
    this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
  }
  public interface OnTouchingLetterChangedListener{
    public void onTouchingLetterChanged(String s);
  }
}

그리고 나 서 나 는 Activity 에서 OnTouchingLetter Changed Listener 에서 손가락 이 어떤 자 모 를 만 졌 는 지 감청 한 다음 에 목록 을 해당 하 는 위치 로 옮 겼 다.
이니셜 알림 상자 팝 업:

private class LetterListViewListener implements OnTouchingLetterChangedListener{
    @Override
    public void onTouchingLetterChanged(final String s) {
      if(alphaIndexer.get(s) != null) {
        int position = alphaIndexer.get(s);
        personList.setSelection(position);
        overlay.setText(sections[position]);
        overlay.setVisibility(View.VISIBLE);
        handler.removeCallbacks(overlayThread);
        //         , overlay    
        handler.postDelayed(overlayThread, 1500);
      }
    }
}

1 초 지연 은 팝 업 의 이니셜 알림 상 자 를 보이 지 않 게 합 니 다.즉,그 이니셜 알림 상 자 는 1 초 만 표 시 됩 니 다.

//  overlay   
private class OverlayThread implements Runnable {
    @Override
    public void run() {
      overlay.setVisibility(View.GONE);
    }
}

그리고 남자 의 이니셜 병 음 을 해석 하 는 문제 도 있 습 니 다.저 는 시스템 데이터 베 이 스 를 찾 았 습 니 다.안에 sort 가 있 습 니 다.key 이 열,예 를 들 어 이름 이 장 삼 이 라면 그 가 대응 하 는 sort키 는 바로:ZHANG 장산 삼,이렇게 되면 훨씬 쉬 워 집 니 다.

//         
private String getAlpha(String str) {
    if (str == null) {
      return "#";
    }
    if (str.trim().length() == 0) {
      return "#";
    }
    char c = str.trim().substring(0, 1).charAt(0);
    //      ,            
    Pattern pattern = Pattern.compile("^[A-Za-z]+{1}quot;);
    if (pattern.matcher(c + "").matches()) {
      return (c + "").toUpperCase();
    } else {
      return "#";
    }
}

만약 당신 의 데이터 가 연락처 표 에서 찾 은 것 이 아니라면 제3자 jar 가방 을 사용 할 수 있 습 니 다.바로 pinyin4j-2.5.0 입 니 다.
activity 코드 와 레이아웃 파일 이 길 어서 여기에 붙 이지 않 겠 습 니 다.
첨부:demo 소스 코드 는 여 기 를 클릭 하 십시오본 사이트 다운로드
더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.,,,,,,,
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기