尊重勞動成果,轉載請標明出處http://www.cnblogs.com/tangZH/p/8423803.html android滑動組件的scrollBar,看了不是很順眼,沒辦法,因為項目需求,得自定義一個。 1、自定義一個View,繼承HorizontalScrollView 2、根據需求自 ...
尊重勞動成果,轉載請標明出處http://www.cnblogs.com/tangZH/p/8423803.html
android滑動組件的scrollBar,看了不是很順眼,沒辦法,因為項目需求,得自定義一個。
1、自定義一個View,繼承HorizontalScrollView
2、根據需求自己繪畫出一個scrollBar,可以在dispatchDraw()中繪製,實踐證明,在onDraw()方法中繪製無效
/**
* 繪製滑動條的畫筆
*
* @param context
*/
private Paint mPaint;
mPaint = new Paint(); mPaint.setColor(getResources().getColor(R.color.gb_theme)); mPaint.setStyle(Paint.Style.FILL);
/** * 畫底部滑動條,用onDraw()方法無效 * * @param canvas */ @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); canvas.drawRect(scrollBarLeft, getHeight() - scrollBarHeight, scrollBarLeft + scrollBarWidth, getHeight(), mPaint); }
scrollBarLeft為滑動條距離屏幕左邊距的距離
scrollBarWidth為滑動條的寬度
scrollBarHeight為滑動條的高度
getHeight()為我們自定義view的高度
這樣我們就在自定義HorizontalScrollView的底部畫出了滑動條
3、接下來我們需要做的就是監聽HorizontalScrollView的滑動,讓滑動條也跟著滑動,想到滑動,我們自然會想到下麵這個方法
protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); }
這個方法具體啥含義呢?怎麼用呢?裡面的參數有代表啥呢?請看我另一篇博客:
int saveDistance = 0;
@Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); //當快速拋動,手指離開屏幕時,就會出現l 與 oldl 重覆出現的情況,
//而且都是相鄰的兩次,原因還不知道,若是哪位朋友知道了可以告訴我 //這種情況下不要去繪製滑動條 if (saveDistance == l) return; else saveDistance = l; //滑動條的左邊緣x坐標應該為HorizontalScrollView滑動的距離乘以滑動條的滑動比例,
// 加上HorizontalScrollView滑動的距離 // (因為滑動條也會跟著滑動,所以應該抵消滑動條被帶著滑動的距離) scrollBarLeft += ((l - oldl) + (l - oldl) * xPos);
//重新繪製
invalidate(); }
xPos為啥?xPos為滑動比例,因為我們的屏幕小固定,但是HorizontalScrollView的寬度可以超出了整個屏幕,看下圖:
所以我們的滑動比例應該這樣算
mWidth//滑動欄的寬度
mScreenWidth//屏幕的高度
scrollBarStartDis//滑動條開始時候距離屏幕左邊的舉例,假設滑動到最右邊距離屏幕也為這個距離
//滑動條的滑動範圍 scrollBarLeft ~ mScreenWitdh-scroolBarWidth-scrollBarStartDis-scrollBarStartDis float rangeBar = mScreenWidth - scrollBarWidth - scrollBarStartDis * 2; //水平滑動欄的滑動範圍 float rangeScrollView = mWidth - mScreenWidth; //滑動比例 xPos = rangeBar/(rangeScrollView * 1.0f);
到此我們就已經結束了scrollBar的繪製了