zoukankan      html  css  js  c++  java
  • EditTextView

      1 package com.egojit.android.sops.views.EditText;
      2 
      3 import android.content.Context;
      4 import android.graphics.drawable.Drawable;
      5 import android.text.Editable;
      6 import android.text.TextWatcher;
      7 import android.util.AttributeSet;
      8 import android.view.MotionEvent;
      9 import android.view.animation.Animation;
     10 import android.view.animation.CycleInterpolator;
     11 import android.view.animation.TranslateAnimation;
     12 import android.widget.EditText;
     13 
     14 import com.asuka.android.asukaandroid.R;
     15 
     16 /**
     17  * 备注:
     18  * 作者:王莹
     19  * 时间:2017/4/25.
     20  */
     21 
     22 public class EditTextView extends EditText {
     23     private Drawable mClearDrawable;
     24     private String edit_type;
     25     private boolean isSee = false;//密码是否可见
     26     private static final int PASSWORD_MINGWEN = 0x90;
     27     private static final int PASSWORD_MIWEN = 0x81;
     28     private int mDrawablePadding = 16;
     29     String myNamespace = "http://schemas.android.com/apk/res-auto";
     30 
     31     public EditTextView(Context context) {
     32         this(context, null);
     33     }
     34 
     35     public EditTextView(Context context, AttributeSet attrs) {
     36         this(context, attrs, android.R.attr.editTextStyle);
     37     }
     38 
     39     public EditTextView(Context context, AttributeSet attrs, int defStyle) {
     40         super(context, attrs, defStyle);
     41 
     42         edit_type = attrs.getAttributeValue(myNamespace,
     43                 "edit_type");
     44         init();
     45     }
     46 
     47     private void init() {
     48         //获取EditText的DrawableRight,getCompoundDrawables()获取Drawable的四个位置的数组
     49         mClearDrawable = getCompoundDrawables()[2];
     50         if (mClearDrawable == null) {
     51             if (edit_type.equals("name")) {
     52 //          默认显示的是删除按钮
     53                 mClearDrawable = getResources().getDrawable(R.drawable.delete);
     54             } else if (edit_type.equals("password")) {
     55                 // 默认显示的是明文密文按钮
     56                 mClearDrawable = getResources().getDrawable(R.drawable.icon_eye);
     57             }
     58         }
     59         //设置图标的位置以及大小,getIntrinsicWidth()获取显示出来的大小而不是原图片的大小
     60         mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth() + 10, mClearDrawable.getIntrinsicHeight() + 10);
     61         //默认设置隐藏图标
     62         setClearIconVisible(false);
     63         //设置输入框里面内容发生改变的监听
     64         addTextChangedListener(new TextWatcher() {
     65             @Override
     66             public void beforeTextChanged(CharSequence s, int start, int count, int after) {
     67 
     68             }
     69 
     70             @Override
     71             public void onTextChanged(CharSequence s, int start, int before, int count) {
     72                 setClearIconVisible(s.length() > 0);
     73             }
     74 
     75             @Override
     76             public void afterTextChanged(Editable s) {
     77 
     78             }
     79         });
     80     }
     81 
     82     /**
     83      * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去
     84      *
     85      * @param visible
     86      */
     87     protected void setClearIconVisible(boolean visible) {
     88         Drawable right = visible ? mClearDrawable : null;
     89         setCompoundDrawables(getCompoundDrawables()[0],
     90                 getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
     91     }
     92 
     93     /**
     94      * 设置晃动动画
     95      */
     96     public void setShakeAnimation() {
     97         this.startAnimation(shakeAnimation(3));
     98     }
     99 
    100     /**
    101      * 晃动动画
    102      *
    103      * @param counts 1秒钟晃动多少下
    104      * @return
    105      */
    106     public static Animation shakeAnimation(int counts) {
    107         Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);
    108         translateAnimation.setInterpolator(new CycleInterpolator(counts));
    109         translateAnimation.setDuration(1000);
    110         return translateAnimation;
    111     }
    112 
    113     @Override
    114     public boolean onTouchEvent(MotionEvent event) {
    115         if (event.getAction() == MotionEvent.ACTION_UP) {
    116             if (getCompoundDrawables()[2] != null) {
    117                 //getTotalPaddingRight()图标左边缘至控件右边缘的距离
    118                 //getWidth() - getTotalPaddingRight()表示从最左边到图标左边缘的位置
    119                 //getWidth() - getPaddingRight()表示最左边到图标右边缘的位置
    120                 boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())
    121                         && (event.getX() < ((getWidth() - getPaddingRight())));
    122 
    123                 if (touchable) {
    124                     if (edit_type != null) {
    125                         if (edit_type.equals("name")) {
    126                             this.setText("");
    127                         } else if (edit_type.equals("password")) {
    128                             if (isSee) {
    129                                 //设置不可见
    130                                 this.setInputType(PASSWORD_MIWEN);//密文
    131                                 this.setSelection(this.length());//设置光标显示
    132                                 mClearDrawable = getResources().getDrawable(R.drawable.loginmiwen);
    133                                 setIcon(mClearDrawable);
    134                             } else {
    135                                 //设置可见
    136                                 this.setInputType(PASSWORD_MINGWEN);//明文
    137                                 this.setSelection(this.length());//设置光标显示
    138                                 mClearDrawable = getResources().getDrawable(R.drawable.loginmingwen);
    139                                 setIcon(mClearDrawable);
    140                             }
    141                             isSee = !isSee;
    142                         }
    143                     } else {
    144                         //默认为进行删除操作
    145                         this.setText("");
    146                     }
    147                 }
    148             }
    149         }
    150         return super.onTouchEvent(event);
    151     }
    152 
    153     private void setIcon(Drawable mDeleIcon) {
    154         //设置图标的位置以及大小,getIntrinsicWidth()获取显示出来的大小而不是原图片的大小
    155         mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth() + 10, mClearDrawable.getIntrinsicHeight() + 10);
    156         setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[0], mDeleIcon, getCompoundDrawables()[0]);
    157     }
    158 }
  • 相关阅读:
    Codeforces Round #251 (Div. 2) A
    topcoder SRM 623 DIV2 CatAndRat
    topcoder SRM 623 DIV2 CatchTheBeatEasy
    topcoder SRM 622 DIV2 FibonacciDiv2
    topcoder SRM 622 DIV2 BoxesDiv2
    Leetcode Linked List Cycle II
    leetcode Linked List Cycle
    Leetcode Search Insert Position
    关于vim插件
    Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones
  • 原文地址:https://www.cnblogs.com/wangying222/p/8117652.html
Copyright © 2011-2022 走看看