筆記:View

View


  • View的left,top,bottom,right對(duì)應(yīng)于源碼中的mLeft,mTop,mBottom,mRight,
    是相對(duì)于父容器而言的抛人。獲取方式箱沦,getLeft(),getTop,getRight(),getBottom()

  • 從Android 3.0開始磷支,View增加了幾個(gè)額外參數(shù)侯繁,x,y,translationX和translationY膝昆,也都是相對(duì)于父容器组贺。

x凸舵,y是view的左上角坐標(biāo)
translationX和translationY是相對(duì)于父容器的偏移量,默認(rèn)值為0

關(guān)系:x= left+translationX, y=top+translationY


  • 在平移過程中失尖,top和left表示原始左上角坐標(biāo)的位置啊奄,不會(huì)發(fā)生改變,發(fā)生改變的只有x,y,translationX,translationY.

  • 通過MotionEvent可以獲得點(diǎn)擊事件發(fā)生的點(diǎn)的x,y坐標(biāo)

getX()/getY() 獲取相當(dāng)于當(dāng)前View左上角的坐標(biāo)

getRawX()/getRowY() 返回相當(dāng)于屏幕的左上角的坐標(biāo)


  • TouchSlop 系統(tǒng)所能識(shí)別出的被認(rèn)為是滑動(dòng)的最小距離 p125

獲取方式:

ViewConfiguration.get(getContext()).getScaledTouchSlop();

  • VelocityTracker 速度追蹤掀潮,用于追蹤手指在滑動(dòng)過程中的速度菇夸。p126

  • GestrueDetector 手勢(shì)檢測(cè),用于輔助檢測(cè)用戶的單擊滑動(dòng)雙擊長按等行為
    GestrueDetector mGestrueDetector = new GestrueDetector();
    //解決長按屏幕后無法拖動(dòng)現(xiàn)象
    mGestrueDetector.setIsLongpressEnable(flase);
    
    //接管目標(biāo)View的onTouchEvent,在onTouchEvent中做如下處理
    boolean consume = mGestrueDetector.onTouchEvent(event);
    return consume;

  • Scroller 彈性滑動(dòng)對(duì)象

需要和View的computeScroll方法配合使用

    
    Scroller scroller = new Scroller(getContext());

    private void smoothScrollTo(int destX, int destY) {
        int scrollX = getScrollX();
        int delta = destX - scrollX;
        //1000ms 內(nèi)滑向 destX,效果就是慢慢滑動(dòng)
        scroller.startScroll(scrollX, 0, delta, 0, 1000);
        invalidate();
    }

    @Override
    public void computeScroll() {
        if (scroller.computeScrollOffset()) {
            scrollTo(scroller.getCurrX(), scroller.getCurrY());
            postInvalidate();
        }
    }



  • scrollTo,scrollBy只能改變View的內(nèi)容位置仪吧,而不能改變View在布局中的位置

mScrollX指View左邊緣到View內(nèi)容左邊緣的距離庄新,mScrollY同理

View的左邊緣在View內(nèi)容左邊緣的右邊時(shí),mScrollX值為正(從右向左滑動(dòng)),View上邊緣在View內(nèi)容上邊緣的下邊時(shí)择诈,mScroll值為正(從下往上滑動(dòng))械蹋。

獲取方式:getScrollX(),getScrollY()


View事件分發(fā)機(jī)制

View事件分發(fā)機(jī)制

如果給一個(gè)View設(shè)置了onTouchListener,那么它的onTouchListener的onTouch方法會(huì)被調(diào)用,這時(shí)就看onTouch的返回值羞芍,如果返回false哗戈,則當(dāng)前View的onTouchEvent會(huì)被調(diào)用,在onTouchEvent中荷科,如果當(dāng)前view設(shè)置有onClickListener唯咬,那么它的onClick方法會(huì)被調(diào)用

由此可見 onTouchListener>onTouchEvent>onClickListenr.


  • requestDisallowInteceptTouchEvent()在子元素干預(yù)父元素的事件分發(fā)過程

1

2

  • Activity的事件分發(fā)過程:

當(dāng)一個(gè)點(diǎn)擊事件發(fā)生時(shí),事件最新傳遞給Activity的dispatchTouchEvent,由它來派發(fā)事件畏浆,具體會(huì)由Activity的Window來進(jìn)行處理胆胰,Window會(huì)將事件傳遞給DecorView,decor view一般就是界面的底層容器,

Activity dispatchTouchEvent源碼分析:
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();
        }
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

如果返回了true則activity的dispatchTouchEvent也就執(zhí)行完畢了全度,如果返回false煮剧,則交由activity onTouchEvent處理。

window中的分發(fā)是由其實(shí)現(xiàn)類phoneWindow來分發(fā)的将鸵。PhoneWindow直接將事件分發(fā)給DecorView(FrameLayout)


  • 頂級(jí)容器對(duì)事件的分發(fā)過程


    頂級(jí)容器對(duì)事件的分發(fā)過程

  • View的onClick事件執(zhí)行是在onTouchEvent中的ACTION_UP中執(zhí)行的勉盅。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市顶掉,隨后出現(xiàn)的幾起案子草娜,更是在濱河造成了極大的恐慌,老刑警劉巖痒筒,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宰闰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡簿透,警方通過查閱死者的電腦和手機(jī)移袍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來老充,“玉大人葡盗,你說我怎么就攤上這事》茸牵” “怎么了觅够?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巷嚣。 經(jīng)常有香客問我喘先,道長,這世上最難降的妖魔是什么廷粒? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任窘拯,我火速辦了婚禮红且,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘树枫。我一直安慰自己直焙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布砂轻。 她就那樣靜靜地躺著奔誓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搔涝。 梳的紋絲不亂的頭發(fā)上厨喂,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音庄呈,去河邊找鬼蜕煌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诬留,可吹牛的內(nèi)容都是我干的斜纪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼文兑,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盒刚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绿贞,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤因块,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后籍铁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涡上,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年拒名,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吩愧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡增显,死狀恐怖雁佳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甸怕,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布腮恩,位于F島的核電站梢杭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏秸滴。R本人自食惡果不足惜武契,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咒唆,春花似錦届垫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浸船,卻和暖如春妄迁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背李命。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工登淘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人封字。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓黔州,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阔籽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子流妻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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