1. 程式人生 > >Android輸入框帶刪除按鈕的自定義View

Android輸入框帶刪除按鈕的自定義View

廢話不多說,用最少的程式碼來實現,記得弄一張名字叫 common_ic_delete 做完刪除的圖到drawable裡。

package com.aiitec.widgets;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import 
android.text.TextUtils; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.EditText; /** * @author Anthony * @createTime 2016-06-20 * 帶刪除按鈕的輸入框,點選X就刪除文字,並提供一個刪除監聽介面 * */ public class DeleteEditText extends EditText { private int padding, drawablePadding; private
Bitmap deleteImg ; private int deleteX, deleteY, deleteW, deleteH; public DeleteEditText(Context context){ super(context); init(); } public DeleteEditText(Context context, AttributeSet attrs){ super(context, attrs); init(); } public DeleteEditText(Context context, AttributeSet attrs, int
defStyleAttr){ super(context, attrs, defStyleAttr); init(); } private void init(){ padding = dip2px(getContext(), 4); drawablePadding = dip2px(getContext(), 8); int backgroundRec = getResources().getIdentifier("common_ic_delete", "drawable", getContext().getPackageName()); if (backgroundRec > 0) { Drawable drawable = getResources().getDrawable(backgroundRec); deleteImg = ((BitmapDrawable) drawable).getBitmap(); } } public void setPadding(int padding) { this.padding = padding; } public void setDrawablePadding(int drawablePadding) { this.drawablePadding = drawablePadding; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(!TextUtils.isEmpty(getText().toString().trim()) && deleteImg != null){ int x = getWidth() - deleteImg.getWidth()- drawablePadding-padding; int y = (getHeight() - deleteImg.getHeight())>>1; //刪除按鈕區域比,按鈕大4dp deleteX = x-padding; deleteW = x + deleteImg.getWidth() + padding; deleteY = y - padding; deleteH = y + deleteImg.getHeight() + padding; Paint paint = new Paint(); canvas.drawBitmap(deleteImg, x, y, paint); } } private long downTime ; @Override public boolean dispatchTouchEvent(MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: downTime = System.currentTimeMillis(); break; case MotionEvent.ACTION_UP: long upTime = System.currentTimeMillis(); if(upTime-downTime < 500 ){ //短按才算,長按不算 if(event.getX() > deleteX && event.getX()<deleteW && event.getY() > deleteY && event.getY()<deleteH){ //點選刪除按鈕區域 setText(""); if(onDeleteListener != null){ onDeleteListener.onDelete(); } } } break; } return super.dispatchTouchEvent(event); } private OnDeleteListener onDeleteListener; public void setOnDeleteListener(OnDeleteListener onDeleteListener) { this.onDeleteListener = onDeleteListener; } /** * 刪除按鈕監聽介面 */ public interface OnDeleteListener{ void onDelete(); }; public static int dip2px(Context context, float dpValue) { float scale = context.getResources().getDisplayMetrics().density; return (int)(dpValue * scale + 0.5F); } }