Android view高度和滑動事件 實戰

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);
    }

 
 
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章