學(xué)習(xí)自GcsSloop扩然,鏈接地址梳星;
同時參考任玉剛的Android開發(fā)藝術(shù)探索
記錄下自己不熟悉的地方菜秦。
一、.MotionEvent中 get 和 getRaw 的區(qū)別
event.getX()和event.getY() ? ? ? //觸摸點相對于其所在組件坐標(biāo)系的坐標(biāo),也就是相對于自身來說
event.getRawX()和event.getRawY;? ? //觸摸點相對于屏幕默認坐標(biāo)系的坐標(biāo),相對于整個屏幕來說
以前不知道區(qū)分這兩個概念咱枉,順便把作者的圖拿來了卑硫。相當(dāng)直觀。
二蚕断、角度和弧度
角度:兩條射線從圓心向圓周射出欢伏,形成一個夾角和夾角正對的一段弧。當(dāng)這段弧長正好等于圓周長的360分之一時亿乳,兩條射線的夾角的大小為1度.(即將整個圓分為360份硝拧,夾角所對應(yīng)的弧長所占的比例即為該夾角的角度)
弧度:兩條射線從圓心向圓周射出,形成一個夾角和夾角正對的一段弧风皿。當(dāng)這段弧長正好等于圓的半徑時河爹,兩條射線的夾角大小為1弧度.(圓弧長對半徑的比值即為弧度,園轉(zhuǎn)一圈是2π弧度.)
等價關(guān)系:360(角度) = 2π(弧度) ==> 180(角度) = π(弧度)
rad 是弧度桐款, deg 是角度
rad = deg x π / 180 ?
弧度=角度*π/180
deg = rad x 180 / π
角度=弧度x 180 / π
公式就是看著比較頭疼啊咸这。。魔眨。當(dāng)年數(shù)學(xué)還是不錯的媳维。結(jié)果現(xiàn)在發(fā)現(xiàn)都快忘光了==、這次正好復(fù)習(xí)下
在默認的屏幕坐標(biāo)系中左上為原點遏暴,角度增大方向為順時針侄刽。
三、自定義View分類與流程
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 自定義View繪制流程函數(shù)調(diào)用鏈(簡化版)
3.1自定義View的分類
? ? 1.自定義ViewGroup
? ? ?1.1繼承ViewGroup派生特殊的Layout
? ? ? 這種方法主要用于實現(xiàn)自定義的布局朋凉,即除了系統(tǒng)布局以外的布局州丹,采用這種方式需要處理ViewGroup的測量、布局杂彭,還得處理子元素的測量和布局過程墓毒,比較麻煩。?
? ? ? 1.2繼承特定的ViewGroup
? ? ? ?當(dāng)需要某種效果看起來像幾種View組合在一起的時候亲怠,可以采用這種方式實現(xiàn)所计,采用這種方式不要自己處理ViewGroup的測量和布局,一般來說上個方式能實現(xiàn)的這個也可以實現(xiàn)团秽,不過上種方式更接近View的底層主胧。
? ? ?2.自定義View
? ? ?2.1繼承View重寫onDraw方法
? ? ? ? 主要是重寫onDraw方式叭首,需要自己支持wrap_content和padding的處理。
? ? ?2.2繼承特定的View
? ? ? ? 直接繼承已有的View踪栋,進行功能的拓展
3.2測量View大小(onMeasure)
在onMeasure方法中焙格,參數(shù)為intwidthMeasureSpec, intheightMeasureSpec,但是這不是寬和高己英,而是由寬间螟、高和各自方向上對應(yīng)的測量模式來合成的一個值,(這句還是不太理解)
可以通過MeasureSpec.getSize(widthMeasureSpec);得到具體的寬高
注意:
如果對View的寬高進行修改了损肛,不要調(diào)用super.onMeasure(widthMeasureSpec,heightMeasureSpec);要調(diào)用setMeasuredDimension(widthsize,heightsize);這個函數(shù)。
3.3.確定View大小(onSizeChanged)
onSizeChanged中的寬高就是最終的寬高