Android 不规则图形点击区域判断

本文介绍一种利用 三角函数角度 点击坐标图片中心点坐标(或某一点)的连线长短 判断点击区域

如要判断这张图片的点击区域:

1.首先在初始化图片iv_bg后,测量iv_bg的坐标,得到图片的中心坐标:

ViewTreeObserver vto2 = iv_bg.getViewTreeObserver();
vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
iv_bg.getViewTreeObserver().removeGlobalOnLayoutListener(this);
// 中心坐标
x = (iv_bg.getRight() - iv_bg.getLeft()) / 2;
y = (iv_bg.getBottom() - iv_bg.getTop()) / 2;
XSLUtils.Log(TAG, "中心点 x坐标=" + x + " y坐标=" + y);
}
});

2.考虑到适配问题  在这里拿到屏幕密度:

// 获取屏幕测量工具DisplayMetrics


DisplayMetrics dm = mHomeActivity.getResources().getDisplayMetrics();
float density = dm.density;//屏幕密度系数
multiple = density/2;


3.然后 给iv_bgset一个OnTouchListener();

iv_bg.setOnTouchListener(new onIVTouch());

class onIVTouch implements OnTouchListener {

private double A;
private int stnumber;

@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
java.text.DecimalFormat df = new java.text.DecimalFormat(
"#0.00");
// double B = Math.acos((a*a + c*c - b*b)/(2.0*a*c));

int X = (int) event.getX();
int Y = (int) event.getY();
// 利用三角函数算法   得到点到圆心的连线长和角度
int lin = (int) Math
.sqrt((X - x) * (X - x) + (Y - y) * (Y - y));
double B = Math.acos(((x - X) * (x - X) + lin * lin - (y - Y)
* (y - Y))
/ (2.0 * (X - x) * lin));
A = Math.abs(90 - Math.toDegrees(B));// 绝对值
String temp = df.format(A);


Log.i("TAG", "点击x坐标=" + X + "点击y坐标=" + Y);
Log.i("TAG", "线段长=" + lin);
Log.i("TAG", "角度a=" + temp);

//在这里根据屏幕密度系数 计算点击点与中心店坐标连线的长度 和角度  判断点击象限 
if (lin > 275*multiple && lin < 350*multiple) {
if (X > x && Y < y) {
Log.i(TAG, "外围第1层第1象限" + "角度=" + temp);
if (A > 0 && A < 15) {
XSLUtils.showToast(mHomeActivity, "夏至" + "角度="
+ temp);
jumpKBActivity(STNUMBER_XIAZHI);
}
if (A > 15 && A < 30) {
XSLUtils.showToast(mHomeActivity, "小暑" + "角度="
+ temp);
jumpKBActivity(STNUMBER_XIAOSHU);
}
if (A > 30 && A < 45) {
XSLUtils.showToast(mHomeActivity, "大暑" + "角度="
+ temp);
jumpKBActivity(STNUMBER_DASHU);
}
if (A > 45 && A < 60) {
XSLUtils.showToast(mHomeActivity, "立秋" + "角度="
+ temp);
jumpKBActivity(STNUMBER_LIQIU);
}
if (A > 60 && A < 75) {
XSLUtils.showToast(mHomeActivity, "处暑" + "角度="
+ temp);
jumpKBActivity(STNUMBER_CHUSHU);
}
if (A > 75 && A < 90) {
XSLUtils.showToast(mHomeActivity, "白露" + "角度="
+ temp);
jumpKBActivity(STNUMBER_BAILU);
}
}
if (X < x && Y < y) {
Log.i(TAG, "外围第1层第2象限" + "角度=" + temp);
if (A > 0 && A < 15) {
XSLUtils.showToast(mHomeActivity, "芒种" + "角度="
+ temp);
jumpKBActivity(STNUMBER_MANGZHONG);
}
if (A > 15 && A < 30) {
XSLUtils.showToast(mHomeActivity, "小满" + "角度="
+ temp);
jumpKBActivity(STNUMBER_XIAOMAN);
}
if (A > 30 && A < 45) {
XSLUtils.showToast(mHomeActivity, "立夏" + "角度="
+ temp);
jumpKBActivity(STNUMBER_LIXIA);
}
if (A > 45 && A < 60) {
XSLUtils.showToast(mHomeActivity, "谷雨" + "角度="
+ temp);
jumpKBActivity(STNUMBER_YUSHUI);
}
if (A > 60 && A < 75) {
XSLUtils.showToast(mHomeActivity, "清明" + "角度="
+ temp);
jumpKBActivity(STNUMBER_QINGMING);
}
if (A > 75 && A < 90) {
XSLUtils.showToast(mHomeActivity, "春分" + "角度="
+ temp);
jumpKBActivity(STNUMBER_CHUNFEN);
}


}
if (X < x && Y > y) {
Log.i(TAG, "外围第1层第3象限" + "角度=" + temp);
if (A > 0 && A < 15) {
XSLUtils.showToast(mHomeActivity, "立冬" + "角度="
+ temp);
jumpKBActivity(STNUMBER_LIDONG);
}
if (A > 15 && A < 30) {
XSLUtils.showToast(mHomeActivity, "小寒" + "角度="
+ temp);
jumpKBActivity(STNUMBER_XIAOHAN);
}
if (A > 30 && A < 45) {
XSLUtils.showToast(mHomeActivity, "大寒" + "角度="
+ temp);
jumpKBActivity(STNUMBER_DAHAN);
}
if (A > 45 && A < 60) {
XSLUtils.showToast(mHomeActivity, "立春" + "角度="
+ temp);
jumpKBActivity(STNUMBER_LICHUN);
}
if (A > 60 && A < 75) {
XSLUtils.showToast(mHomeActivity, "雨水" + "角度="
+ temp);
jumpKBActivity(STNUMBER_YUSHUI);
}
if (A > 75 && A < 90) {
XSLUtils.showToast(mHomeActivity, "惊蛰" + "角度="
+ temp);
jumpKBActivity(STNUMBER_JINGZHE);
}
}
if (X > x && Y > y) {
Log.i(TAG, "外围第1层第4象限" + "角度=" + temp);
if (A > 0 && A < 15) {
XSLUtils.showToast(mHomeActivity, "大雪" + "角度="
+ temp);
jumpKBActivity(STNUMBER_DAXUE);
}
if (A > 15 && A < 30) {
XSLUtils.showToast(mHomeActivity, "小雪" + "角度="
+ temp);
jumpKBActivity(STNUMBER_XIAOXUE);
}
if (A > 30 && A < 45) {
XSLUtils.showToast(mHomeActivity, "立冬" + "角度="
+ temp);
jumpKBActivity(STNUMBER_LIDONG);
}
if (A > 45 && A < 60) {
XSLUtils.showToast(mHomeActivity, "霜降" + "角度="
+ temp);
jumpKBActivity(STNUMBER_SHUANGJIANG);
}
if (A > 60 && A < 75) {
XSLUtils.showToast(mHomeActivity, "寒露" + "角度="
+ temp);
jumpKBActivity(STNUMBER_HANLU);
}
if (A > 75 && A < 90) {
XSLUtils.showToast(mHomeActivity, "秋分" + "角度="
+ temp);
jumpKBActivity(STNUMBER_QIUFEN);
}
}


}
if (lin < 275*multiple && lin > 225*multiple) {
if (X > x && Y < y) {
Log.i(TAG, "外围第2层第1象限" + "角度=" + temp);
if (A > 0 && A < 45) {
XSLUtils.showToast(mHomeActivity, "丁" + "角度="
+ temp);
}
if (A > 45 && A < 90) {
XSLUtils.showToast(mHomeActivity, "庚" + "角度="
+ temp);
}
}
if (X < x && Y < y) {
Log.i(TAG, "外围第2层第2象限" + "角度=" + temp);
if (A > 0 && A < 45) {
XSLUtils.showToast(mHomeActivity, "丙" + "角度="
+ temp);
}
if (A > 45 && A < 90) {
XSLUtils.showToast(mHomeActivity, "乙" + "角度="
+ temp);
}
}
if (X < x && Y > y) {
Log.i(TAG, "外围第2层第3象限" + "角度=" + temp);
if (A > 0 && A < 45) {
XSLUtils.showToast(mHomeActivity, "癸" + "角度="
+ temp);
}
if (A > 45 && A < 90) {
XSLUtils.showToast(mHomeActivity, "甲" + "角度="
+ temp);
}
}
if (X > x && Y > y) {
Log.i(TAG, "外围第2层第4象限" + "角度=" + temp);
if (A > 0 && A < 45) {
XSLUtils.showToast(mHomeActivity, "壬" + "角度="
+ temp);
}
if (A > 45 && A < 90) {
XSLUtils.showToast(mHomeActivity, "辛" + "角度="
+ temp);
}
}
}
if (lin < 225*multiple && lin > 160*multiple) {
if (X > x && Y < y) {
Log.i(TAG, "外围第3层第1象限" + "角度=" + temp);
if (A > 0 && A < 22.5) {
XSLUtils.showToast(mHomeActivity, "离三" + "角度="
+ temp);
}
if (A > 22.5 && A < 67.5) {
XSLUtils.showToast(mHomeActivity, "坤八" + "角度="
+ temp);
}
if (A > 67.5 && A < 90) {
XSLUtils.showToast(mHomeActivity, "兑二" + "角度="
+ temp);
}
}
if (X < x && Y < y) {
Log.i(TAG, "外围第3层第2象限" + "角度=" + temp);
if (A > 0 && A < 22.5) {
XSLUtils.showToast(mHomeActivity, "离三" + "角度="
+ temp);
}
if (A > 22.5 && A < 67.5) {
XSLUtils.showToast(mHomeActivity, "巽五" + "角度="
+ temp);
}
if (A > 67.5 && A < 90) {
XSLUtils.showToast(mHomeActivity, "震四" + "角度="
+ temp);
}
}
if (X < x && Y > y) {
Log.i(TAG, "外围第3层第3象限" + "角度=" + temp);
if (A > 0 && A < 22.5) {
XSLUtils.showToast(mHomeActivity, "坎六" + "角度="
+ temp);
}
if (A > 22.5 && A < 67.5) {
XSLUtils.showToast(mHomeActivity, "艮七" + "角度="
+ temp);
}
if (A > 67.5 && A < 90) {
XSLUtils.showToast(mHomeActivity, "震四" + "角度="
+ temp);
}
}
if (X > x && Y > y) {
Log.i(TAG, "外围第3层第4象限" + "角度=" + temp);
if (A > 0 && A < 22.5) {
XSLUtils.showToast(mHomeActivity, "坎六" + "角度="
+ temp);
}
if (A > 22.5 && A < 67.5) {
XSLUtils.showToast(mHomeActivity, "乾一" + "角度="
+ temp);
}
if (A > 67.5 && A < 90) {
XSLUtils.showToast(mHomeActivity, "兑二" + "角度="
+ temp);
}
}
}
if (lin < 160*multiple && lin > 110*multiple) {
if (X > x && Y < y) {
Log.i(TAG, "外围第4层第1象限");
XSLUtils.showToast(mHomeActivity, "外围第4层第1象限"
+ "角度=" + temp);
}
if (X < x && Y < y) {
Log.i(TAG, "外围第4层第2象限");
XSLUtils.showToast(mHomeActivity, "外围第4层第2象限"
+ "角度=" + temp);
}
if (X < x && Y > y) {
Log.i(TAG, "外围第4层第3象限");
XSLUtils.showToast(mHomeActivity, "外围第4层第3象限"
+ "角度=" + temp);
}
if (X > x && Y > y) {
Log.i(TAG, "外围第4层第4象限");
XSLUtils.showToast(mHomeActivity, "外围第4层第4象限"
+ "角度=" + temp);
}
}
if (lin < 110*multiple && lin > 70*multiple) {
if (X > x && Y < y) {
Log.i(TAG, "春夏秋冬第1象限");
XSLUtils.showToast(mHomeActivity, "春夏秋冬第1象限" +
"角度="
+ temp);
}
if (X < x && Y < y) {
Log.i(TAG, "春夏秋冬第2象限");
XSLUtils.showToast(mHomeActivity, "春夏秋冬第2象限" +
"角度="
+ temp);
}
if (X < x && Y > y) {
Log.i(TAG, "春夏秋冬第3象限");
XSLUtils.showToast(mHomeActivity, "春夏秋冬第3象限" +
"角度="
+ temp);
}
if (X > x && Y > y) {
Log.i(TAG, "春夏秋冬第4象限");
XSLUtils.showToast(mHomeActivity, "春夏秋冬第4象限" +
"角度="
+ temp);
}
}
if (lin < 78*multiple) {
if (X > x && Y < y) {
Log.i(TAG, "八卦第1象限");
XSLUtils.showToast(mHomeActivity, "八卦第1象限" + "角度="
+ temp);
}
if (X < x && Y < y) {
Log.i(TAG, "八卦第2象限");
XSLUtils.showToast(mHomeActivity, "八卦第2象限" + "角度="
+ temp);
}
if (X < x && Y > y) {
Log.i(TAG, "八卦第3象限");
XSLUtils.showToast(mHomeActivity, "八卦第3象限" + "角度="
+ temp);
}
if (X > x && Y > y) {
Log.i(TAG, "八卦第4象限");
XSLUtils.showToast(mHomeActivity, "八卦第4象限" + "角度="
+ temp);
}
}
break;
default:
break;
}
return false;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值