自定義View常用方法

1.onFinishInflate()

當(dāng)View中所有的子控件均被映射成xml后觸發(fā),從這里getChildAt才能得到子View

2.onSizeChanged()

在控件大小發(fā)生改變時調(diào)用观挎。所以這里初始化會被調(diào)用一次
作用:獲取控件的寬和高度

3.requestDisallowInterceptTouchEvent

阻止View的攔截事件

4.ViewConfigurationCompat.getScaledPagingTouchSlop(configuration)

觸發(fā)移動事件的最小距離

5.getScrollX/getScrollY

返回當(dāng)前滑動View左邊界的位置,其實獲取的值就是這塊幕布在窗口左邊界時的x/y坐標(biāo)孕索,即內(nèi)容滑動的大小

6.scrollTo(int x,int y)

讓View相對于初始的位置滾動某段距離

7.scrollBy(int x,int y)

讓View相對于當(dāng)前的位置滾動某段距離

8.Scroller構(gòu)造方法

mScroller = new Scroller(context);
mScroller = new Scroller(context, interpolator, true);

9.Scroller:startScroll(x1, y1, offset_x, offset_y);

初始化滾動數(shù)據(jù)
滾動開始時X的坐標(biāo),第二個參數(shù)是滾動開始時Y的坐標(biāo)躏碳,第三個參數(shù)是橫向滾動的距離搞旭,正值表示向左滾動,第四個參數(shù)是縱向滾動的距離唐断,正值表示向上滾動

10.Scroller:computeScrollOffset()

判斷滑動動畫是否結(jié)束

11.computeScroll

其內(nèi)部完成平滑滾動的邏輯 选脊。在整個后續(xù)的平滑滾動過程中,computeScroll()方法是會一直被調(diào)用的脸甘,因此我們需要不斷調(diào)用Scroller的computeScrollOffset()方法來進(jìn)行判斷滾動操作是否已經(jīng)完成了恳啥,如果還沒完成的話,那就繼續(xù)調(diào)用scrollTo()方法丹诀,并把Scroller的curX和curY坐標(biāo)傳入钝的,然后刷新界面從而完成平滑滾動的操作
提前停止動畫:

scroller.abortAnimation();

12.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

關(guān)閉View繪制硬件加速,硬件加速在開啟的情況下很容易與Canvas和paint的一些配置不兼容铆遭,最常見的就是拋出不支持異常硝桩,如果有人在開啟硬件加速的頁面使用一下的接口,注意要加上try..catch代碼防止出現(xiàn)問題枚荣。
Canvas不支持硬件加速的二維繪圖接口:

  • clipPath()
  • clipRegion()
  • drawPicture()
  • drawPosText()
  • drawTextOnPath()
  • drawVertices()

Paint不支持硬件加速的接口:

  • setLinearText()
  • setMaskFilter()
  • setRasterizer()

13.isHardwareAccelerated

判斷View是否被硬件加速

14.layout(int l, int t, int r, int b)

讓父布局重新擺放自己

15.offsetLeftAndRight()與offsetTopAndBottom()

使view左右/上下移動碗脊,以android坐標(biāo)系為準(zhǔn),大于0往正方向移動橄妆,小于0往負(fù)方向移動

15.ViewGroup中測量思路

1.根據(jù)MeasureSpec寬高mode和size

int specMode = MeasureSpec.getMode(spec);
  int specSize = MeasureSpec.getSize(spec);

2.遍歷子View并且測量衙伶,得到子view的寬高

測量子View的方法包括兩個,一種考慮margin害碾,一種不考慮margin,在getChildMeasureSpec方法中矢劲,會根據(jù)當(dāng)前viewgroup的MeasureSpec和子View期望的寬高生成新的MeasureSpec

    protected void measureChildWithMargins(View child,
            int parentWidthMeasureSpec, int widthUsed,
            int parentHeightMeasureSpec, int heightUsed) {
        final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();

        final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
                mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin
                        + widthUsed, lp.width);
        final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,
                mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin
                        + heightUsed, lp.height);

        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
    }


    protected void measureChild(View child, int parentWidthMeasureSpec,
            int parentHeightMeasureSpec) {
        final LayoutParams lp = child.getLayoutParams();

        final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
                mPaddingLeft + mPaddingRight, lp.width);
        final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,
                mPaddingTop + mPaddingBottom, lp.height);

        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
    }

3.根據(jù)子View的寬高結(jié)合自身需求,設(shè)置自己的寬高

16.VelocityTracker

測試滑動速度慌随。

初始化:

VelocityTracker tracker=VelocityTracker.obtain();

計算1000ms內(nèi)滑動的平均速度:

tracker.computeCurrentVelocity(1000);

獲取到水平方向上的速度:

  float xV = tracker.getXVelocity();

重置速度計算器:

 tracker.clear();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芬沉,一起剝皮案震驚了整個濱河市躺同,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丸逸,老刑警劉巖蹋艺,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異椭员,居然都是意外死亡车海,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門隘击,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人研铆,你說我怎么就攤上這事埋同。” “怎么了棵红?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵凶赁,是天一觀的道長。 經(jīng)常有香客問我逆甜,道長虱肄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任交煞,我火速辦了婚禮咏窿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘素征。我一直安慰自己集嵌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布御毅。 她就那樣靜靜地躺著根欧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪端蛆。 梳的紋絲不亂的頭發(fā)上凤粗,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音今豆,去河邊找鬼嫌拣。 笑死,一個胖子當(dāng)著我的面吹牛晚凿,可吹牛的內(nèi)容都是我干的亭罪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歼秽,長吁一口氣:“原來是場噩夢啊……” “哼应役!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤箩祥,失蹤者是張志新(化名)和其女友劉穎院崇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袍祖,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡底瓣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蕉陋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捐凭。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凳鬓,靈堂內(nèi)的尸體忽然破棺而出茁肠,到底是詐尸還是另有隱情,我是刑警寧澤缩举,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布垦梆,位于F島的核電站,受9級特大地震影響仅孩,放射性物質(zhì)發(fā)生泄漏托猩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一辽慕、第九天 我趴在偏房一處隱蔽的房頂上張望京腥。 院中可真熱鬧,春花似錦鼻百、人聲如沸绞旅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽因悲。三九已至,卻和暖如春勺爱,著一層夾襖步出監(jiān)牢的瞬間晃琳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工琐鲁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卫旱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓围段,卻偏偏與公主長得像顾翼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奈泪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 自定義View作為Android進(jìn)階的基礎(chǔ)适贸,是我們開發(fā)者不得不學(xué)習(xí)的知識灸芳,而酷炫的自定義View效果,都離不...
    maoqitian閱讀 1,593評論 0 6
  • 其實一直沒想好自定義控件這塊怎么寫拜姿,因為涉及面太廣烙样,而且我自定義控件能力其實很一般。先寫著蕊肥,再優(yōu)化吧谒获。網(wǎng)上也有很多...
    土肥圓的諾諾閱讀 3,288評論 0 8
  • 一滑動效果的產(chǎn)生 滑動一個View,本質(zhì)區(qū)別就是移動一個View壁却。改變當(dāng)前View所在的坐標(biāo)批狱,原理和動畫相似不斷改...
    猿萬閱讀 9,903評論 0 14
  • 預(yù)備知識 Android屏幕區(qū)域劃分我們先看一副圖來了解一下Android屏幕的區(qū)域劃分,如下:Android屏幕...
    小蕓論閱讀 8,960評論 6 44
  • View的事件體系 View的基礎(chǔ) view位置參數(shù)View的位置主要由它的四個頂點來決定展东,分別對應(yīng)于View的四...
    MZzF2HC閱讀 517評論 0 2