在我们android 开发的时候,常常用到TextView或者EditText的drawableRight和drawableLeft属性,如果左边或者右边的图片不需要点击的时候还好,一旦需要点击的时候相信很多小伙伴的选择肯定就是放弃使用drawableRight和drawableLeft属性,而是使用TextView+ImageView的组合为ImageView设置点击事件,这样虽然也能实现这样的功能但是这样会使我们的布局文件比较冗长。如果继续使用drawableRight和drawableLeft属性,会大大减少布局层数,优化程序性能。好了闲话少说,咱们直入主题,
首先说一下实现思路,了解android事件分发机制的小伙伴们都知道,view的事件分发首先会调用dispatchTouchEvent方法,在这个方法中会调用onTouch事件,根据onTouch的返回值(true or false)决定是否继续往下传递,意味着onClick事件的执行是在onTouch之后,并且是否执行是由onTouch返回值决定的。那么对我们来说, 只要在onTouch事件中对点击图片还是点击TextView做出区分,这个问题就迎刃而解了。在 ontouch中事件监听中,我们首先获取当我们手指点击屏幕时候的X轴坐标,然后获取布局中TextView这个控件的宽度和drawableRight(drawableLeft)的宽度,当x轴坐标大于(drawableRight)或者小于(drawableLeft)textview减去控件的宽度的时候就触发点击事件,否则的话就不触发,这样就能实现对drawableRight和drawableLeft的点击触发事件,下面的贴出简单的代码。
1.布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
android:gravity="center"
tools:context="com.example.lyb.myapplication.DrawableClickActivity">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:drawableRight="@drawable/four_copy_vx"
android:text="右边图片的点击"
/>
</LinearLayout>
2.activity的代码
package com.example.lyb.myapplication;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
/*
* Creat By Lyb
*
*/
public class DrawableClickActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drawable_click);
textView = (TextView) findViewById(R.id.tv);
textView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Drawable drawable = textView.getCompoundDrawables()[2];
if (drawable == null) {
return false;
}
//drawleft 是 小于 ,drawright 是 大于
//左右上下分别对应 0 1 2 3
if (event.getX() > textView.getWidth() - textView.getCompoundDrawables()[2].getBounds().width()) {
Log.d("lyb", "444");
//点击之后执行的事件
Toast.makeText(DrawableClickActivity.this, "右边的drawright被点击了", Toast.LENGTH_SHORT).show();
textView.setText("我被点击了");
// Intent intent =new Intent(DrawableClickActivity.this,CountDownActivity.class);
// startActivity(intent);
return false;
}
return false;
}
});
}
}
好啦 !!大功告成,这样就能实现对drawableRight和drawableLeft的点击事件的监听了