Android View滑動與自定義

2021-07-24 20:38:22 字數 4048 閱讀 5329

一、view的滑動:

1.獲取最小滑動距離:

int touchslop = viewconfiguration.get(context).getscaledtouchslop();

2.scroller類(滑動控制):

(1)建立:

scroller scroller = new scroller(context);

(2)控制滑動:

//getscrollx()獲取當前view的x座標,

mscroller.startscroll(getscrollx(), 0, 距離值, 0, math.abs(delta));   //此句設定目標座標值

invalidate();  //此句真實移動

(3)實現computescroll方法,進行實時移動(多次移動就形成了連續動畫):

@override

public void computescroll()

}3.velocitytracker類(獲取x軸與y軸滑動速率,單位:畫素/時間):

(1)建立:

velocitytracker vt = velocitytracker.obtain();

(2)接管view的ontouchevent事件:

vt.addmovement(event);

(3)計算速率:

vt.computecurrentvelocity(1000);

(4)獲取速率:

float xv = vt.getxvelocity();  //x軸方向速率

float yv = vt.getyvelocity();  //y軸方向速率

(5)釋放:

vt.clear();

vt.recycle();

4.gesturedetector類(對一些手勢的封裝):

gesturedetector gd = new gesturedetector(new gesturedetector.ongesturelistener()

@override

public void onshowpress(motionevent e)

@override

public boolean onsingletapup(motionevent e)

@override

public boolean onscroll(motionevent e1, motionevent e2, float distancex, float distancey)

@override

public void onlongpress(motionevent e)

@override

public boolean onfling(motionevent e1, motionevent e2, float velocityx, float velocityy)

});gd.setondoubletaplistener(new gesturedetector.ondoubletaplistener()

@override

public boolean ondoubletap(motionevent e)

@override

public boolean ondoubletapevent(motionevent e)

});//處理長按後無法拖動的問題

gd.islongpressenabled();

二、父view與子view巢狀滑動處理:

1.父view的onintercepttouchevent中處理action_move事件,對需要由父view拖動的情況返回true:

@override

public boolean onintercepttouchevent(motionevent ev)

break;

}return false;

}2.由子view處理事件:

(1)父view的onintercepttouchevent中除action_down事件全部返回true:

@override

public boolean onintercepttouchevent(motionevent ev)

return true;

}(2)子view的dispatchtouchevent方法中處理

@override

public boolean dispatchtouchevent(motionevent ev)

break;

}return false;}

三、view的測量模式:

specmode模式有3種:

unspecified:

無大小限制,此值一般在系統內使用

exactly:

精確大小,指定match_params和或數值

at_most:

大小不確定,對應wrap_content

獲取specmode模式:

int specmode = measurespec.getmode(spce);

獲取寬高值

int specsize = measurespec.getsize(spce);

四、自定義view:

1.繼承view,重寫ondraw方法,顯示內容,並且處理有padding值的情況:

protected void ondraw(canvas canvas)

2.重寫onmeasure,處理寬度與高度為wrap_content的情況:

@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec) else if(widthmode == measurespec.at_most) else if(heightmode == measurespec.at_most)

}

四、自定義viewgroup:

1.重寫onmeasure方法,為子view測量寬度與高度,為自身測量大小:

@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)

if (v != null) else if (widthmode == measurespec.at_most) else if (heightmode == measurespec.at_most) }}

2.重寫onlayout方法,為子view布局位置與大小:

@override

protected void onlayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) }}

五、view的自定義屬性:

1.在values下建立attrs.xml檔案(檔名可以任意):

<?xml version="1.0" encoding="utf-8"?>

//color表示顏色屬性(reference為資源id,還有基本資料型別等)

2.在xml中使用自定義屬性:

... />

3.在**中獲取布局中的自定義屬性:

typedarray ta = context.obtainstyledattributes(attrs, r.styleable.屬性集合名);

int color = ta.getcolor(styleable.屬性名1, 預設值);

ta.recycle();

Android View之彈性滑動

一 使用scroller 繼承自rlativelayout,通過invalidate 和postinvalidate 兩個方法的靈活運用 public class mainactivity extends relativelayout mscroller.startscroll方法什麼也沒做,只是保...

Android View的 滑動衝突及工作流程

一簡單場景下 如 水平滑動裡面巢狀一層垂直滑動 解決辦法很多,這裡記乙個方法。通過水平滑動的距離dx與垂直滑動的距離dy的大小來判斷是水平還是垂直滑動。通常有外部攔截跟內部攔截,外部攔截即重寫父容器的onintercepttouchevent,而內部攔截即重寫子元素的dispatchtoucheve...

Android,View的拖拽與接收

要被拖拽的view物件.startdraganddrop public final boolean startdraganddrop clipdata data,dragshadowbuilder shadowbuilder,object mylocalstate,int flags 啟用拖拽 引數...