開源庫 bouncyEditText解析,開源bouncyedittext
轉載請註明出處:王亟亟的大牛之路
運行效果
如何使用?
在布局XML裡引用即可,如下:
<com.mingle.BouncyEditText android:layout_width="fill_parent" android:hint="帳號" android:text="255" android:layout_height="wrap_content"> </com.mingle.BouncyEditText>
跟別的自訂控制項一樣操作。
只需要在項目包裡複製內貼BouncyEditText這個類和對應的一些資源檔即可,也可以Library相應的LIB包。
我們來讀下核心類:
public class BouncyEditText extends EditText { private int hintColor=getResources().getColor(R.color.hint_color); private Paint paint; private Status status= Status.ANIMATION_NONE; private String hintText; private Interpolator animOutInterpolator; private Interpolator animInInterpolator; private float animInDuration=200.0f; private float animOutDuration=260.0f; private boolean isSetPadding=false; private boolean isHasHint = false; public BouncyEditText(Context context) { super(context); } public BouncyEditText(Context context, AttributeSet attrs) { super(context, attrs); init(); } public BouncyEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { paint=new Paint(); //初始化一些動畫效果 animOutInterpolator = new OvershootInterpolator(1.3f); animInInterpolator = new DecelerateInterpolator(); if(getHint()!=null) { isHasHint =true; hintText = getHint().toString(); setHint(""); }// if (!TextUtils.isEmpty(getText().toString())) {// status = Status.ANIMATION_OUT;//// } else {// status = Status.ANIMATION_IN;// } } //版本相容 @TargetApi(Build.VERSION_CODES.LOLLIPOP) public BouncyEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } long startTime; private String preString; //繼承textview重寫的方法 @Override protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { super.onTextChanged(text, start, lengthBefore, lengthAfter); if(!isHasHint){ return; } if(TextUtils.isEmpty(preString) != TextUtils.isEmpty( getText().toString())) { if (!TextUtils.isEmpty(getText().toString())) { status = Status.ANIMATION_OUT; } else { status = Status.ANIMATION_IN; } preString = (String) getText().toString(); startTime = System.currentTimeMillis(); } } @Override public void setText(CharSequence text, BufferType type) { super.setText(text, type); if(TextUtils.isEmpty(text)){ text=""; } preString= (String) text; } public void setHintText(String hintText) { this.hintText = hintText; isHasHint =true; this.hintText = hintText; setHint(""); } //具體的畫一些效果啊,動作什麼的,我們用就行了。 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(!isHasHint){ return; } paint.set(getPaint()); paint.setAntiAlias(true); paint.setColor(hintColor) ; if(!isSetPadding) { setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight() + (int) paint.measureText(hintText), getPaddingBottom()); isSetPadding=true; } float maxHintY = getBaseline(); switch (status){ case ANIMATION_IN: if(System.currentTimeMillis()-startTime<animInDuration ){ float hintX=getCompoundPaddingLeft() + getScrollX()+(getWidth()-getCompoundPaddingRight()-getCompoundPaddingLeft())*(1- animInInterpolator.getInterpolation((System.currentTimeMillis()-startTime)/animInDuration)); canvas.drawText(hintText,hintX,maxHintY,paint); postInvalidate(); }else{ float hintX = getCompoundPaddingLeft(); canvas.drawText(hintText, hintX, maxHintY, paint); } break; case ANIMATION_OUT: if(System.currentTimeMillis()-startTime<animOutDuration ){ float hintX=getCompoundPaddingLeft() + getScrollX()+(getWidth()-getCompoundPaddingRight()-getCompoundPaddingLeft())* animOutInterpolator.getInterpolation((System.currentTimeMillis()-startTime)/animOutDuration); canvas.drawText(hintText,hintX,maxHintY,paint); postInvalidate(); }else{ float hintX= getScrollX()+(getWidth()-getCompoundPaddingRight()); canvas.drawText(hintText, hintX, maxHintY, paint); } break; case ANIMATION_NONE: if(getText().toString().length()==0){ float hintX = getCompoundPaddingLeft() + getScrollX(); canvas.drawText(hintText,hintX,maxHintY,paint); }else{ float hintX= getScrollX()+(getWidth()-getCompoundPaddingRight()); canvas.drawText(hintText,hintX,maxHintY,paint); } break; } } public enum Status{ ANIMATION_IN, ANIMATION_NONE, ANIMATION_OUT }}
color.xml
<resources> <color name="hint_color">#9e9e9e</color></resources>
當然如果是伸手黨,就更簡單,複製上面的一堆,然後用就行了。很簡單,效果也不錯。
http://yunpan.cn/cQ74xshPWkExJ 訪問密碼 5597