1. 程式人生 > >自定義控制元件心得

自定義控制元件心得

對於自定義控制元件,要知道怎麼獲得當前控制元件的寬高,相對於父控制元件的擺放位置

要知道怎麼獲得子控制元件,如何擺放子控制元件,如何測量子控制元件

view.getLayoutParams().width獲得控制元件在佈局檔案中設定的尺寸,可以是常量FILL_PARENT之一(由API級別8中的MATCH_PAREN獲得當前控制元件的寬高T替換)或WRAP_CONTENT。或確切的大小。

 

獲得當前控制元件的寬高

   getMeasuredHeight()

   getMeasuredWidth()

相對於父控制元件的擺放位置

 getLeft ()getRight ()。。。。

一.View移動的相關方法總結:
  1.通過改變view在父View的layout位置來移動,但是隻能移動指定的View:
    view.layout(l,t,r,b);
    view.offsetLeftAndRight(offset);//同時改變left和right
    view.offsetTopAndBottom(offset);//同時改變top和bottom
  2.通過改變scrollX和scrollY來移動,但是可以移動所有的子View;
    scrollTo(x,y);
    scrollBy(xOffset,yOffset);
  3.通過改變Canvas繪製的位置來移動View的內容:
    canvas.drawBitmap(bitmap, left, top, paint)
    
二.使用ViewDragHelper來處理移動
  1.ViewDragHelper在高版本的v4包(android4.4以上的v4)中
  2.它主要用於處理ViewGroup中對子View的拖拽處理
  3.它是Google在2013年開發者大會提出的 
  4.它主要封裝了對View的觸控位置,觸控速度,移動距離等的檢測和Scroller,通過介面回撥的
    方式告訴我們;只需要我們指定是否需要移動,移動多少等;  
  5.本質是對觸控事件的解析類;
    
三.getHeight和getMeasuredHeight的區別:
  getMeasuredHeight:只要view執行完onMeasure方法就能夠獲取到值;
  getHeight:只有view執行完layout才能獲取到值;
  
四.在自定義ViewGroup的時候,如果對子View的測量沒有特殊的需求,那麼可以繼承系統已有的
   佈局(比如FrameLayout),目的是為了讓已有的佈局幫我們實行onMeasure;
   

/**
 * 側滑面板控制元件, 抽屜面板.
 * @author poplar
 * 
 *   測量             擺放     繪製
  measure   ->  layout  ->  draw
      |           |          |
  onMeasure -> onLayout -> onDraw 重寫這些方法, 實現自定義控制元件
  
	  View流程
	  onMeasure() (在這個方法裡指定自己的寬高) -> onDraw() (繪製自己的內容)
	  
	  ViewGroup流程
	  onMeasure() (指定自己的寬高, 所有子View的寬高)-> onLayout() (擺放所有子View) -> onDraw() (繪製內容)
 *
 */