Android 自定義View過程中的一些知識點(diǎn),持續(xù)更新

  • 以下是在自定義View過程中的一些總結(jié),從不理解到理解,從不會(huì)到會(huì)的一個(gè)過程中,中間會(huì)學(xué)會(huì)很多的一些關(guān)于自定義view的一些知識點(diǎn),將其記錄下來。好記性不如爛筆頭,時(shí)時(shí)重溫,如果有不對的地方請麻煩指證,謝謝

  關(guān)于在自定義View過程中的getHeight和getMeasureHeight()這兩個(gè)的區(qū)別:
  getMeasureHeight():
    必須在OnMeasure()這個(gè)方法執(zhí)行之后才能得到控件的寬高,一般在自定View的過程中會(huì)使用
    getMeasuredHeight/Width()這個(gè)方法獲取到控件的寬高.
  getHeight():
    必須在OnLayout這個(gè)方法執(zhí)行完成后能才能得getHeight()的值,這個(gè)時(shí)候拿到的值是實(shí)際我們
    能看到顯示在界面上的寬高。
  如果不重寫onLayout對控件的擺放位置進(jìn)行修改的話,這兩個(gè)拿到的值是相等的。
在代碼中可以用如下方式獲取到getHeight和getMeasuredHeight這兩個(gè)方法的值
getHeight();
  view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
      @Override    
      public void onGlobalLayout() {
        //這個(gè)是在當(dāng)view在執(zhí)行onLayout方法執(zhí)行完成之后執(zhí)行的。
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        int height = headView.getHeight();    
     }
  });
 
getMeasuredHeight():
  view.measure(0,0)//會(huì)通知系統(tǒng)去測量這個(gè)view
  view.getMeasuredHeight();//這個(gè)時(shí)候拿到的值是測量之后的值,不會(huì)是0了

關(guān)于在自定義ViewGroup中的移動(dòng)
主要有三種方式:
     layout(l,t,r,b);
    scrollTo(x,y);
    offsetLeftAndRight(offset);      左右同時(shí)移動(dòng)
    offsetTopAndBottom(offset);      上下同是移動(dòng)
移動(dòng)的不是子View的位置,而是移動(dòng)的是當(dāng)前ViewGroup的邊框在移動(dòng)。

/**
  *當(dāng)前ViewGroup的1級子view全部加載完成調(diào)用,可以初始化子view的引用
  *這里只寫了兩個(gè)View的示例
  */
@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    mLeftView = getChildAt(0);
    mLeftViewWidth = mLeftView.getLayoutParams().width;
    Log.d("SlideMenu", "mLeftViewWidth:" + mLeftViewWidth);
    mMainView = getChildAt(1);
    mMainViewWidth = mLeftView.getLayoutParams().width;
    /**
     *下面這兩個(gè)方法是拿不到控件的寬度的,可以用 mLeftView.getLayoutParams().width這個(gè)方        
     *法拿到控件的寬
    */
    int width = getWidth();
    int measuredWidth = getMeasuredWidth();
}

關(guān)于ViewDragHelper的使用
ViewDragHelper的移動(dòng)效果內(nèi)部也是利用了offsetLeftAndRight(offset)和offsetTopAndBottom(offset)這兩個(gè)方法
這兩個(gè)方法在高版本中已經(jīng)實(shí)現(xiàn)了刷新的方法,而在低版本中,并沒有實(shí)現(xiàn)
這會(huì)導(dǎo)致
onViewPositionChanged(View changedView, int left, int top, int dx, int dy)
這個(gè)方法的回調(diào)后不能移動(dòng)的問題,解決的方法,重寫這個(gè)方法,添加invalidate()就能實(shí)現(xiàn)低版本的兼容,
        @Override
        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
            //do somthing
            invalidate();
        }

同樣低版本的原因,view設(shè)置綻放,平移,等一些操作,如果有明確的指明兼容低本的話,可以引入
兼容低版本.png
    用法:
        低版本:
        ViewHelper.setScaleX(view, value);
        ViewHelper.setScaleY(view, value);
        ViewHelper.setTranslationX(view, value);
        ViewHelper.setAlpha(view,value);
        ……
      高版本:
        view.setScaleX(value);
        view.setScaleY(value);
        view.setAlpha(value);
        view.setTranslationX(value);
        ……
兩者效果是一樣的
OnTouchEvent(event)獲取action的兩種方法
  

    重繪的界面有多種:
    invalidate();
    postInvalidate();//線程中使用
    ViewCompat.postInvalidateOnAnimation(viewgroup);// 

在自定義View的自定義屬性中,有很多不同的自定義屬性通過xml的方式來獲取,由于android 的adt14以上的版本的R.java的id類不再設(shè)置為final類型,導(dǎo)置我們在寫成一個(gè)Library的時(shí)候,如果在獲取的時(shí)寫成switch case語言編譯器會(huì)報(bào)錯(cuò),可以寫成if else的形式來獲取,或者直接獲取屬性對應(yīng)的值,這個(gè)在eclise和Android Studio都會(huì)出現(xiàn)的問題,不是編譯器的問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評論 25 709
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 47,158評論 22 665
  • 現(xiàn)在說起“主人翁”,主要是講樹立“主人翁意識”,即提倡大家要把工作或公事當(dāng)成自己的事來完成。 “主...
    我是過眼煙云閱讀 1,494評論 0 1
  • 此書是和書友們的第二本書的共享,共享第一本【你在忙什么】我已經(jīng)在共享書目錄中剛好看著這一本書,因?yàn)橐黄鸸蚕砼R時(shí)放棄...
    王奇才閱讀 757評論 0 2
  • 你為什么不喜歡聚會(huì)?當(dāng)然如果你喜歡接下來內(nèi)容也可以看看,說不定對你也有啟發(fā)。 我就是一個(gè)不太喜歡聚...
    安妮Anne666閱讀 1,714評論 11 6

友情鏈接更多精彩內(nèi)容