1.一个view,我直接new处理,不添加任何处理,我的宽和高是多少
Android 正确获取View的宽和高
问题:一个view的宽和高是由什么决定!
从源码可以看出来,子View的测量模式是由自身LayoutParam和父View的MeasureSpec来决定的。
Android View 显示在屏幕中需经过 measure、layout(ViewGroup 独有)、draw 三个步骤完成,其中 View 的尺寸测量是三个步骤中最为复杂的一个,理解好 View 的 measure 过程,是理解另外两个流程的基础
android中View的GONE和INVISIBLE的原理
Gone:得不到宽和高
INVISIBLE可以的都宽高
发现:
viewRoot=View.inflate(context, R.layout.tab_main_group_run, this);
getViews();
setViewsOnClick();
init();
int webViewHeightheight = webView.getHeight();
Log.d("peng", "onLoadFinish_height" + webViewHeightheight+"view height"+viewRoot.getHeight());
int webViewHeightheight = webView.getHeight();
FindViewById的时候控件的宽高还有可能是0.
要在界面渲染完成之后,宽和高才不是0;
2019-12-26 11:17:47.584 23631-23631/com.yuedong.sport D/peng: onLoadFinish_height0view height0
2019-12-26 11:17:48.420 23631-23631/com.yuedong.sport E/peng: Tabgroup_onLoadFinish_height930viewRoot height1080
2019-12-26 11:17:48.425 23631-23631/com.yuedong.sport E/peng: Tabgroup_onLoadFinish_height930viewRoot height1080
自定义控件不错的地方
------------------------------------------------------------------------------
事件分发机制
rootView
2个viewGoup
1个webview和一个ViewGroup(包含4个btn)
点击btn的时候,会消费掉事件
问题:viewgroup点击空白也是会有事件的,如果给他添加监听
加入点击空白页面,Viewgroup的子View消费掉。(webview的子空间)
问题:不想让子控件消费怎么做
1.可以自己消费掉,ontouch==true。不再传递了,onclick事件就不会执行
2.可以让另外一个viewgourp自己消费掉。
ontouch==true,自己的onclick不会在执行,但是这个子view还是响应了
原因:因为没有拦截,走了子类的dispathevent方法。子类的dispathevent----ontouch---子类的onclick方法消费了。
所以消费是onclick和ontouch方法,但是onclick方法也是要先调用ontouch---ontouchevnet----onclick。
总结:最后的消费🈯️的时onTouch事件
方案1:
1.在mainActivity里面最底层invisible,然后把事件处理
2.监控每个activity,然后在phonewindow下面添加,也要处理事件 。优点:每个地方都会有
1)。得到application,监控生命周期
2)。在activity添加view的操作
3)。处理事件
------------------------
问题:viewgroup的ontouchEvent方法到底有什么用?
首页滑动问题
改动一个viewpager不行,得父类和子类都控制
父类不想滑动:
1)。不拦截 2)。onTouchEvent返回false
子类滑动:
1)。用系统的 2.onTouchEvent用系统的
public class YdViewPager extends ViewPager {
private boolean isCanScroll = true;
public YdViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public YdViewPager(Context context) {
super(context);
}
public void setCanScroll(boolean isCanScroll) {
this.isCanScroll = isCanScroll;
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
if (isCanScroll) {
return super.onTouchEvent(arg0);
} else {
return false;
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if (isCanScroll) {
return super.onInterceptTouchEvent(arg0);
} else {
return false;
}
}
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item, smoothScroll);
}
@Override
public void setCurrentItem(int item) {
super.setCurrentItem(item, false);
}