一.scroller使用總結
1.scrollerTo和scrollerBy
/**
* scrollTo:移動view內部的內容,記住是內容,view本身沒有發生任何位置上的變化,移動的僅僅是裏面的內容。他的作用是讓裏面的內容相對於最初的位置滾動多少距離
* 記住是相對於最初的位置,這也再次印證了他移動的僅僅是裏面的內容,本身位置沒變
* scrollBy:也是移動view內部的內容,記住是內容,本身沒有任何變化,移動的僅僅是裏面的內容,所以如果想要某個內容移動,需要嵌套一個父view,然後操縱父view來
* 達到移動的目的。他的作用是讓裏面的內容相對於當前的位置移動多少距離,記住是當前的位置,也就說如果連續執行就會連續運動,但是scrollto則只會運動一次
* 備註:參數爲正數時表示向左移動,參數爲負數時表示向右移動
*/
2.scroller使用總結
/**
* scroller使用總結:
* 1.創建scroller對象,可以創建時同時制定運動過程的插值器
* 2.調用scroller.startScroll();方法,參數分別爲起始位置,終點座標,時長
* 3.重寫computeScroll()方法,不停的進行強制重繪
* 注意點:scroller只能在view當中使用,如果拋開這一點,scroller完全可以替代屬性動畫,他們兩個的思維方式是幾乎完全一樣的,
* 當然在view中也可以使用scroller替代屬性動畫
*/
下面是一個例子:(使用就是固定的)
public void changeState(boolean close) {
mState = !close;
mScroller = new Scroller(getContext(), new LinearInterpolator());
if (close) {
mScroller.startScroll(getScrollX(), 0, -mTvZhiDingWidth - mTvDeleteWidth, 0);
} else {
mScroller.startScroll(getScrollX(), 0, mTvZhiDingWidth + mTvDeleteWidth, 0);
}
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
}
二.事件處理總結
/** 參考資料:http://www.gcssloop.com/customview/dispatch-touchevent-theory
* 是否分發事件,默認返回true,說明需要判斷子view是否需要消費此事件,但是如果子類沒有需要消費的就返回false,交給父類的ontouchevent去處理
* @param ev
* @return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
/**
* 是否打斷事件傳遞,dispatchTouchEvent方法調用後會進入此方法,判斷是否需要攔截事件,如果攔截了就進入自己的onTouchEvent處理事件,
* 當然如果onTouchEvent也返回false則事件又交給dispatchTouchEvent處理,返回父類處理;攔截事件默認是不攔截的,即交給子view去處理事件
* 調用子view的dispatchTouchEvent方法,如果子view中沒有消費掉此事件則進入自己的onTouchEvent事件進行處理
* @param ev
* @return
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
/**
* 觸摸事件,如果返回true則表示事件自己處理掉了,如果返回false則表示沒有處理掉,需要父類處理
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}