有时候需要控制一个布局下所有子view是否可以Click、Touch,例如不让布局下的SeekBar、Button等响应拖动和点击事件。
可以通过事件拦截简单实现,在父布局中对事件进行拦截,那么其子view将不会获得Touch事件,也就无法响应Click和Touch了,对SeekBar而言则无法拖动、Button而言则无法点击。
package com.dway.test;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.RelativeLayout;
public class MyLayout extends RelativeLayout {
private boolean mChildViewsCanTouch = true;
public MyLayout(Context context) {
super(context);
}
public MyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 设置该布局的所有子view是否能响应手势事件,例如touch、click
* @param canTouch
*/
public void setChildViewsCanTouch(boolean canTouch){
mChildViewsCanTouch = canTouch;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//事件拦截,返回true则拦截事件传递给子控件,即子控件无法进行touch和click等
return !mChildViewsCanTouch || super.onInterceptTouchEvent(ev);
}
}
使用也很简单:
myLayout.setChildViewsCanTouch(true);//允许子view获得Touch事件
myLayout.setChildViewsCanTouch(false);//禁止子view获得Touch事件