自带删除功能的输入框——在登录,搜索等地方经常用到可以直接用

先看下效果图:0分代码下载,可以直接用


功能的实现,是通过一个Rect来实现好像是点击图片,删除内容的。为什么是好像,因为这张图片本来就获取不到点击事件,反正这不是通过这个方法实现的。Rect顾名思义,就是一个方形的区域,他有三个构造方法,new Rect();new Rect(Rect t);new Rect(int left, int top, int right, int botton)。

从第一个开始说啊new Rect(),英语厉害的直接看文档,反正我的英语不怎么样,我做了几个实验,他会创建一个和父组件大小的这么一个方形区域,例如我在一个宽高100*50的LinearLayout中创建一个Rect(),这个方形区域就是填充他的父组件,他的宽高也是父组件这么大。

ok,第二个new Rect(Rect t);就相当于是在创建一个一模一样的t。

第三个,new Rect(int left, int top, int right, int botton),这四个参数是啥啊,咱们画画吧,例如我是这么创建的new Rect(150, 75, 260, 120)

这四个 参数 分别代表的意思是:left   top   right   bottom  上下左右呗。啊,不就是 左 上 右 下。 下面给大家解释  
left : 矩形左边的X坐标  150        ---->图片中的A点 
top:    矩形顶部的Y坐标   75         ---->图片中的B点 
right :  矩形右边的X坐标   260       ----->图片中的C点 
bottom: 矩形底部的Y坐标 120     ------->图片中的D点 


哈哈,怎么样,这个区域出来了吧,现在问题来了,如果咱们传的这个区域比咱们的手机的屏幕还大怎么办呢?Android很NB,凉拌,超出屏幕的区域不要了,就这么狂。其实想想也能想明白,本来你也用不到啊,呵呵。

我的实现就是通过第一种方法实现的,然后自己再调整这个方形区域的左右区域,调整到图片上,然后你们看代码吧

/**
 * 带删除功能的输入框,经常用在搜索框或者登录中经常用的,可以直接使用
 * 
 * @author luckchoudog
 */
public class EditTextWithDel extends EditText {
	private final static String TAG = EditTextWithDel.class.getSimpleName();
	private Drawable imgInable;
	private Drawable imgAble;
	private Context mContext;

	public EditTextWithDel(Context context) {
		super(context);
		mContext = context;
		init();
	}

	public EditTextWithDel(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mContext = context;
		init();
	}

	public EditTextWithDel(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		init();
	}

	private void init() {
		imgInable = mContext.getResources().getDrawable(R.drawable.delete_gray);
		imgAble = mContext.getResources().getDrawable(R.drawable.delete);
		addTextChangedListener(new TextWatcher() {
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
			}

			@Override
			public void beforeTextChanged(CharSequence s, int start, int count, int after) {
			}

			@Override
			public void afterTextChanged(Editable s) {
				setDrawable();
			}
		});
		setDrawable();
	}

	// 设置删除图片
	private void setDrawable() {
		if (length() < 1)
			setCompoundDrawablesWithIntrinsicBounds(null, null, imgInable, null);
		else
			setCompoundDrawablesWithIntrinsicBounds(null, null, imgAble, null);
	}

	// 处理删除事件
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (getText() != null && event.getAction() == MotionEvent.ACTION_UP) {
			int eventX = (int) event.getRawX();
			int eventY = (int) event.getRawY();
			Rect rect = new Rect();
			getGlobalVisibleRect(rect);
			rect.left = rect.right - imgAble.getMinimumWidth() - this.getPaddingLeft();
			rect.right = rect.right - this.getPaddingLeft();
			Log.d(TAG, "eventX : " + eventX + "; eventY : " + eventY);
			Log.d(TAG, "rect_left : " + rect.left + "; rect_top : " + rect.top + "; rect_right : " + rect.right + "; rect_bottom : " + rect.bottom);
			if (rect.contains(eventX, eventY))
				setText("");
		}
		return super.onTouchEvent(event);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值