1. 程式人生 > >安卓面試之=》自定義View

安卓面試之=》自定義View

純屬個人筆記,學習筆記!!!!!

1:自定義屬性的宣告和獲取 分析要需要的屬性 在res/values/attrs.xml中進行定義宣告,在使用自定義控制元件xml中使用 在自定義控制元件構造方法中獲取 主要用context.obtainStyleAttributes 去獲取,獲取完記得要 a.recycle()釋放資源 2:測量onMeasure ==> (可能會觸發多次) 1:EXACTLY(設定明確的值) AT_MOST(至多不能超過某個值) UNSPECIFIED(沒有限制) 測量模式 2:MeasureSpec ==》輔助類,獲取測量模式+和大小 3:setMeasuredDimension==》測量完後記得要調這個方法把高度設定進去 4:requstLayout() private int measureHeight(int heightMeasureSpec){ int result = 0; int mode = MeasureSpec.getMode(heightMeasureSpec); int size = MeasureSpec.getSize(heightMeasureSpec); if (mode==MeasureSpec.EXACTLY){ result = size; }else { result = getNeedHeight()+ getPaddingTop()+getPaddingBottom();//計算自身高度 if (mode == MeasureSpec.AT_MOST){ result = Math.min(result,size); } } return result; } 3:佈局onLayout(一般是隻有繼承ViewGroup才用) 只會觸發一次
1:決定子View的位置 2:儘可能將onMeasure中一些操作移動到此方法中 3:requestLayout() protected void onLayout(boolean changed, int left, int top, int right, int bottom) { final int chilCount = getChildCount(); for (int i = 0; i < chilCount; i++) { final View child = getChildAt(i); if (child.getVisibility()==GONE) { continue; } left = caculateChildLeft();//計運算元view layout左上角的座標 top = caculateChildTop();//計運算元View layout左上角y座標 child.layout(left,top,left+cWidth,top+cWidth); } super.onLayout(changed, left, top, right, bottom); } 4:繪製onDraw(一般是自定義view)
1:需要繪製的內容 2:觸發 invalidate() 主執行緒 postInvalidate()子執行緒中 3:繪製 就是呼叫Canvas.DrawXXX (Canvas+Paint 一些api的使用) 4:加一些動畫變化 記得在相關位置呼叫者兩個方法onSaceInstanceState() onRestoreInstanceState() 儲存相關資料資訊
5:onTouchEvent 1:onInterceptTouchEven(事件攔截) 2:dispatchTouchEvent(事件分發機制) 如果是繼承ViewGroup==可能需要重寫該方法攔截事件或者事件分發 getParent().requestDisallowInterceptTouchEvent(true);可以通過這個方法來設定觸控時間是否需要被攔截還是要自己消費

ACTION(_DOWN UP MOVE (POINT_DOWN POINT_UP 多點觸控)) 如果要考慮滑動的速度檢測 要初始化VelocityTracker 在時間中要 vt.addMovement(ev) 在ACTION_UP中去進行速度判斷,然後做相應操作 考慮多點觸控的時候可以參考ScrollView進行處理: ==》要考慮哪一個觸點,是那個真正操作當前view ==》當某個觸點擡起了,就要改變當前活躍觸點, 比如當前有三個手指,第二個手指按下,第一個手指產生的觸點就失去了控制權,第二個手指放開了第一個手指又獲得控制權 7:其他 狀態的儲存 onSaveInstanceState onRestoreInstanceState ==>比如progressBar的進度 ViewConfiguration 去獲取相關常量 ScaleGestureDetector 寫一個縮放手勢 ViewDragHelper強大ViewGroup輔助類