Android组件并未直接提供drawableRight的点击事件,可以通过setOnTouchListener实现针对其的点击事件。
editText.setOnTouchListener((v, event) -> {
// 获取drawableRight的边界
Drawable[] drawables = editText.getCompoundDrawables();
Rect rect = new Rect();
editText.getDrawingRect(rect);
Drawable drawableRight = drawables[2];
if (drawableRight != null) {
Rect drawableBounds = drawableRight.getBounds();
// 将drawable的边界转换到视图的坐标系统中
drawableBounds.offset(editText.getCompoundDrawablePadding() + rect.right - drawableBounds.right, 0);
// 检查触摸点是否在drawableRight的区域内
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (drawableBounds.contains((int) event.getX(), (int) event.getY())) {
// 在这里处理点击事件
editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
return true; // 如果处理了事件,返回true
}
}
if(event.getAction() == MotionEvent.ACTION_UP){
if (drawableBounds.contains((int) event.getX(), (int) event.getY())) {
// 在这里处理点击事件
editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
return true; // 如果处理了事件,返回true
}
}
}
return false; // 没有处理事件,返回false以便其他监听器可以处理该事件
});
drawableRight.getBounds();方法将获取到drawableRight的空间域,需要说明的是该方法是以drawableRight左上角作为原点计算的。
event.getX()获取点击位置相对于点击的空间的左上角原点的x轴坐标。