Android判断点击区域

最近项目有这么个需求,后台返回一个图片URL,Android通过该URL加载网络图片,同时需要做到点击图片的不同区域,跳转到不同的Activity页面。此时就需要监听View的点击坐标点以及该坐标点所处的区域。

需要注意的是,Android中的Rect和iOS中的CGRect的概念有点不一样,iOS中的CGRect通过CGRectMake(x, y, width, height)方法进行创建,而Android中的Rect通过public Rect(int left, int top, int right, int bottom)初始化。iOS中的是xywidthheight,对应的是视图的x坐标点y坐标点视图的宽度值视图的高度值;而Android中的是lefttoprightbottom对应的是视图的视图左边距坐标点视图顶部边距的坐标点视图右边距的坐标点视图底部边距的坐标点。Android中的Rect更类似于iOS中的UIEdgeInsets的概念。

下面附上源码

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.wupincheng.myapplication.MainActivity">

    <Button
        android:id="@+id/main_button"
        android:layout_width="800dp"
        android:layout_height="200dp"
        android:text="Button"/>

</RelativeLayout>

Activity代码

public class MainActivity extends AppCompatActivity {

    private int x;
    private int y;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.main_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                /**
                // 水平N等分,通过将count设置为不同的数值就可达到将View按照水平方向平分为N分
                int count = 3;
                int averageWidth = view.getWidth() / count;
                int height = view.getHeight();

                for (int i=0; i<count; i++) {
                    int left = averageWidth * i;
                    Rect rect = new Rect(left, 0, left+averageWidth, height);
                    if (rect.contains(x, y)) {
                        System.out.println("点击按钮第"+i+"块区域");
                        break;
                    }
                }
                 */

                // 十字四等分
                int averageWidth = view.getWidth() / 2;
                int averageHeight = view.getHeight() / 2;
                for (int i=0; i<4; i++) {
                    int left = averageWidth * (i%2);
                    int top = averageHeight * (i/2);
                    Rect rect = new Rect(left, top, left+averageWidth, top+averageHeight);
                    if (rect.contains(x, y)) {
                        System.out.println("点击按钮第"+i+"块区域");
                        break;
                    }
                }
            }
        });

        findViewById(R.id.main_button).setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    x = (int)motionEvent.getX();
                    y = (int)motionEvent.getY();
                }
                return false;
            }
        });
    }
}