繼承ViewGroup實現Scroll滑動效果

2021-07-03 01:52:10 字數 2664 閱讀 5907

extends viewgroup需要重寫onmeasure和onlayout方法

onmeasure方法是去測量viewgroup需要的大小以及包含的子view需要的大小。

執行完上面的方法後,再執行onlayout方法去設定子view的擺放位置。

android為我們提供了velocitytracker這個類檢測速率

使用mvelocitytracker = velocitytracker.obtain();來初始化

使用mvelocitytracker.addmovement(event);將touch事件新增進去檢測。注意每個touch事件都要新增進去

使用mvelocitytracker.computecurrentvelocity(1000);計算每個單位時間內滑動了多少畫素,這裡傳入的是1000ms即1s。

然後使用float pxsec = mvelocitytracker.getxvelocity();獲取到x軸滑動的畫素值,必須在執行了上面方法只會再呼叫。

最後需要mvelocitytracker.recycle();mvelocitytracker = null;**掉這個物件。

完整**是:

public

class

myscrolllayout

extends

viewgroup

public

myscrolllayout(context context, attributeset attrs)

public

myscrolllayout(context context)

private

void

init(context context)

@override

public

void

computescroll()

}@override

public

boolean

ontouchevent(motionevent event)

if(!mscroller.isfinished())

mlastmotionx = event.getx();

break;

case motionevent.action_move:

float delt = mlastmotionx-x;

if(iscanmove((int)delt))

mlastmotionx = x;

scrollby((int)delt, 0);

}break;

case motionevent.action_up:

if(mvelocitytracker!=null)else

if(pxsec<-600 && curscreen1)else

mvelocitytracker.recycle();

mvelocitytracker = null;

}break;

default:

break;

}return

true;

}private

void

snaptoscreen(int screen)

}private

void

snaptodestination()

private

boolean

iscanmove(int delat)*/

if(getscrollx()>=(getchildcount()-1)*getwidth() && delat>0)

return

true;

}@override

protected

void

onlayout(boolean changed, int l, int t, int r, int b) }}

@override

protected

void

onmeasure(int widthmeasurespec, int heightmeasurespec)

}

很多人會以為viewgroup的滑動是scroller的功勞,其實不然,scroller在這裡扮演的角色我認為更像是乙個用來計算x和y軸單位時間移動畫素的工具類而已,僅此而已沒有特別的能力。

真正在這裡實現scroll滑動效果的是viewgroup裡的scrollto和scrollby方法,scrollto是滑動到,scrollby是滑動了。

scroller.startscroll(getscrollx(), 0, delat, 0, math.abs(delat)*2);

scroller這個類的startscroll方法傳入了五個引數,分別對應,x軸起滑的偏移畫素,y軸起滑的偏移畫素,x軸滑動畫素,y軸滑動畫素,滑動過程需要的時間。

看原始碼如果不傳時間引數的方法有個預設的時間250ms。

scroller.startscroll之後需要呼叫invalidate方法,然後呼叫viewgroup的draw方法,然後呼叫computescroll方法,在computescroll方法裡面呼叫scroller.computescrolloffset()方法去判斷有沒有計算完,沒計算完返回true,然後scrollto方法,再postinvalidate();方法重新執行computescroll方法。

記錄下看法,如果有不對的地方求批評指正,謝謝!

Android繼承ViewGroup自定義流式布局

繼承viewgroup自定義布局主要分兩步 1.重寫onmeasure 方法,自己根據子view的大小測量容器的寬高 2.重寫onlayout 方法,自己對每乙個子view進行布局 下面分享一下自己繼承view group實現流式布局的過程 import android.content.contex...

用ViewGroup實現左右滾動

import android.content.context import android.graphics.canvas import android.util.attributeset import android.util.log import android.view.gesturedete...

自定義ViewGroup實現寬度自動換行

自定義viewgroup package com.fenghongzhang.day011 import android.content.context import android.graphics.canvas import android.util.attributeset import an...