以下不是一个完整的演示,只是一些实现流程和思路
比如要获取中间小框框的监听事件
- 以中心点左右100dp为宽
- 以中心点上下150dp为高
1,获取整个屏幕宽度的方法
// get Size
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
mWidth = displayMetrics.widthPixels;
mHeight = displayMetrics.heightPixels;
2,中心区域的监听事件
这是一个不完整的类,可以防止
private OnTouchListener CenterOnTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//mViewWidth 是整个屏幕的宽度
//就是在屏幕的一半+100和-100之间的宽度 同理高度
boolean isCenterOfX = event.getX() < mViewWidth / 2 + 100
&& event.getX() > mViewWidth / 2 - 100;
boolean isCenterOfY = event.getY() < mViewHeight / 2 + 150
&& event.getY() > mViewHeight / 2 - 150;
//如果点击的位置是在这个方形之间
if(isCenterOfX && isCenterOfY){
//必须要点击之后手指离开才进行监听
if(event.getAction() == MotionEvent.ACTION_UP){
Log.i(TAG, "onTouch: Center");
//回调方法 B中注册使用 A就是该Activity进行监听回调
if(mOnUserNeedSettingListener != null){
mOnUserNeedSettingListener.onUserNeedSetting();
}
}
//返回true代表这个事件不向下分发,到这里就停止了
//不会进行下面的方法了
return true;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
}
return false;
}
3,在监听函数对应的活动中设置回调函数
在阿中设置乙中传入回调对象,当甲的状态即点击到中心区域后回调给乙进行相应操作(也可以在同一活动中实现)
也叫观察者模式:具体可以看一下我这篇文章Android App通信 - 观察者模式
private OnUserNeedSettingListener mOnUserNeedSettingListener;
public OnUserNeedSettingListener getOnUserNeedSettingListener() {
return mOnUserNeedSettingListener;
}
public void setOnUserNeedSettingListener(OnUserNeedSettingListener onUserNeedSettingListener) {
mOnUserNeedSettingListener = onUserNeedSettingListener;
}
public interface OnUserNeedSettingListener{
void onUserNeedSetting();
}
4、在注册回调的活动中进行相应操作
// set user setting view listener.
mView.setOnUserNeedSettingListener(new xx类中的.OnUserNeedSettingListener() {
@Override
public void onUserNeedSetting() {
//具体todo
//这里写的是三目运算符,如果该控件处于显示状态,Gone掉,否则显示
mSettingView.setVisibility(mSettingView.getVisibility() == View.VISIBLE
? View.GONE : View.VISIBLE);
}
});