一、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 啟用拖拽 引數...