Android 암호 입력 상자 동적 명문/암호 전환 표시 효과 구현

프로젝트 에서 사용자 에 게 암호 입력 상자 의 명문/비밀문서 전환 디 스 플레이 를 제공 해 야 하 는 수 요 를 만 났 습 니 다.인터넷 에서 한 바퀴 도 완전한 실현 을 발견 하지 못 했 고 다행히 실현 방향 을 찾 았 습 니 다.
먼저 효과 도 를 올 리 고 화면 gif 를 녹화 하 는 강 좌 를 보 았 습 니 다.어 쩔 수 없 이 핸드폰 이 너무 오래된 시스템 버 전 은 지원 되 지 않 고 정적 그림 만 올 라 갑 니 다.

암호 입력 상자 동적 명문/암호 전환 표시
이 효과 도 를 보 았 을 때,당신 은 이미 대략적인 생각 을 알 아 맞 혔 다 고 믿 습 니 다.맞습니다.바로 우리 의 EditText 에 drawable Right 를 설정 하 는 것 입 니 다.그림 속 의 눈 그림 은 한 쌍 의 짝 이 있 습 니 다.martial designde 사이트 에서 다운로드 한 것 입 니 다.사용자 가 drawable Right 를 클릭 할 때 drawable 을 동적 으로 바 꾸 고 그 다음 에 EditText 의 input Type 을 바 꾸 면 우리 의 목 표를 실현 할 수 있 습 니 다.사용자 정의 EditText 를 통 해 쉽게 이 루어 집 니 다.이때 첫 번 째 장애물 이 나 옵 니 다.EditText 의 네 방향 인 Drawable 은 버튼 을 누 르 는 것 과 같은 감청 listener 를 설정 할 수 없습니다.이때 우 리 는 아 날로 그 클릭 을 통 해 효 과 를 얻 을 수 밖 에 없다.주로 EditText 의 onTouchEvent 방법 을 통 해 손가락 이 들 어 올 릴 때의 점 의 좌표 가 drawableRight 구역 에 있 는 지 여 부 를 판단 합 니 다.위치 에 있 으 면 그림 과 input Type 을 동적 으로 바 꾸 는 작업 을 수행 합 니 다.여기 서 판단 규칙 은 매우 간단 합 니 다.점 좌표 의 x 값 은 EditText 의 너비 보다 큽 니 다.-(아이콘 의 너비+아이콘 의 padding+아이콘 에서 컨트롤 의 오른쪽 거리)그리고 x 의 값 은 EditText 의 너비-그림 에서 컨트롤 의 오른쪽 거리 보다 작 습 니 다.정확 한 판단 을 위해 Y 축 방향 으로 판단 할 수 있 습 니 다.
몇 가지 중요 한 방법:getCompoundDrawables();EditText,left,top,right,bottom 네 방향 에 있 는 drawable 을 얻 었 습 니 다.여기 서 우 리 는 주로 right 방향 에 관심 을 가지 고 있 습 니 다.setCompoundDrawables();EditText 에 네 방향의 drawable 을 설정 합 니 다.설정 하기 전에 drawable 의 경계 크기 를 지정 해 야 합 니 다.draw 는 이 값 을 사용 합 니 다.설정 하지 않 으 면 아이콘 이 그 려 지지 않 습 니 다.
EditText 의 input type 을 설정 하 는 방법 입 니 다.이 type 은 필요 에 따라 어떤 종 류 를 사용 할 지 결정 할 수 있 는 여러 가지 유형 이 있 습 니 다.

this.setInputType(EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);    
this.setInputType(EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);     
4 명문 밀 문의 또 다른 실현 방식.
4.567914.텍스트 내용 의 한 줄,점(비밀번호)표시 효 과 는 모두 TransformationMethod 에서 지정 합 니 다.

this.setTransformationMethod(HideReturnsTransformationMethod.getInstance());      
this.setTransformationMethod(PasswordTransformationMethod.getInstance());      
그 다음 에 바로 코드 를 붙 였 습 니 다.생각 은 이미 매니저 가 잘 알 고 코드 주석 도 완전 합 니 다.큰 문 제 는 없 을 거 라 고 믿 습 니 다.

public class TogglePasswordVisibilityEditText extends EditText {
//  drawable   
private Drawable visibilityDrawable;
private boolean visibililty = false;
public TogglePasswordVisibilityEditText(Context context) {
 this(context, null);
}
public TogglePasswordVisibilityEditText(Context context, AttributeSet attrs) {
 //      style  
 this(context, attrs, android.R.attr.editTextStyle);
}
public TogglePasswordVisibilityEditText(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 init();
}
private void init() {
 //   EditText left ,top ,right,bottom     drawable
 Drawable[] compoundDrawables = getCompoundDrawables();
 visibilityDrawable = compoundDrawables[2];
 if (visibilityDrawable == null) {
  visibilityDrawable = getResources().getDrawable(R.drawable.ic_visibility_off_black_24dp);
 }
}
/**
 *              
 *            EditText    - (           +      )  
 * EditText    -                     ,
 */
@Override
public boolean onTouchEvent(MotionEvent event) {
 int action = event.getAction();
 if (action == MotionEvent.ACTION_UP) {
  if (getCompoundDrawables()[2] != null) {
   boolean xFlag = false;
   boolean yFlag = false;
   //         ,      
   xFlag = event.getX() > getWidth() - (visibilityDrawable.getIntrinsicWidth() + getCompoundPaddingRight
     ()) &&
     event.getX() < getWidth() - (getTotalPaddingRight() - getCompoundPaddingRight());
   if (xFlag) {
    visibililty = !visibililty;
    if (visibililty) {
     visibilityDrawable = getResources().getDrawable(R.drawable.ic_visibility_black_24dp);
     /*this.setInputType(EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);*/
     this.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
    } else {
     //    
     visibilityDrawable = getResources().getDrawable(R.drawable.ic_visibility_off_black_24dp);
     //this.setInputType(EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);
     this.setTransformationMethod(PasswordTransformationMethod.getInstance());
    }
    //           
    CharSequence text = this.getText();
    if (text instanceof Spannable) {
     Spannable spanText = (Spannable) text;
     Selection.setSelection(spanText, text.length());
    }
    //  setCompoundDrawables   ,    drawable    ,          
    visibilityDrawable.setBounds(0, 0, visibilityDrawable.getMinimumWidth(),
      visibilityDrawable.getMinimumHeight());
    setCompoundDrawables(getCompoundDrawables()[0],
      getCompoundDrawables()[1], visibilityDrawable, getCompoundDrawables()[3]);
   }
  }
 }
 return super.onTouchEvent(event);
 }
}
위 에서 말 한 것 은 소 편 이 소개 한 안 드 로 이 드 가 비밀번호 입력 상자 의 동적 명문/비밀문서 전환 디 스 플레이 효 과 를 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기