今天的免費課程:“安卓通用控件和布局”
課程大綱
課程今天才免費,24小時后恢復(fù)原價
如果想直接學(xué)習(xí)課程,掃碼學(xué)習(xí)
一、前言
在自定義控件中,難免會遇到滑動場景。但是Canvas提供的scrollTo和scrollBy方法只能達到移動的效果。為了實現(xiàn)真正的滑動,我們需要兩個基本的工具,Scroller和VelocityTracker,我們今天分享這兩個工具。照例先去實戰(zhàn)圖,然后分享。
慣性滑動直方圖
但是(敲黑板??!值得注意的是,屏幕外的欄目其實對用戶是不可見的,我們不需要花這部分資源去畫。我們可以通過下面的代碼來判斷列是否在可見區(qū)域,可見區(qū)域的范圍是屏幕的寬度左右擴展一列間隔mBarInterval。這樣做的原因是,當(dāng)所描述的文本或小紅點正好在屏幕的左邊框或右邊框上時,就不會出現(xiàn)未繪制的情況。
/**
*是否在可視范圍內(nèi)
*
* @paramx
* @returntrue:在可見范圍內(nèi);真:不在可見的假
*/
privatebooleanisivisiblearea(float x){
float dx = x-Getscrollx;
return-mBarInterval & lt;= dx &。& ampdx <。= mViewWidth+mBarInterval;
至此,圖像繪制問題解決,代碼沒有粘貼出去,童鞋可以進入門戶,按照思路走了。
還有一個問題,就是如何讓圖片隨手指移動,需要重寫onTouchEvent方法,計算手指的水平移動距離,然后通過scrollBy方法移動內(nèi)容。
值得一提的是,scrollTo和scrollBy方法都是針對移動內(nèi)容或畫布的。
至于如何讓小紅點移動,使用ValueAnimator從零增加到一,從而不斷逼近目標坐標。
3.慣性怎么滑
上一節(jié)結(jié)束后,我們已經(jīng)知道如何繪制這個簡單但常見的柱形圖,但美中不足的是沒有拋尾效果。因此,我們需要借用VelocityTracker來獲取手指當(dāng)前的滑動速度,但這里需要注意的是,最大和最小速度應(yīng)該是有限制的。因為速度太快太慢,會導(dǎo)致交互效果不佳。獲取如下代碼
mmaximumVelocity = ViewConfiguration . get(context)。getScaledMaximumFlingVelocity
mmimumvelocity = view configuration . get(context)。getScaledMinimumFlingVelocity
然后按照我們在VelocityTracker總結(jié)中的套路,得到手指離開屏幕時的水平速度。下面是只保留VelocityTracker相關(guān)代碼
/**
*控制屏幕不跨越邊界
*
* @param事件
* @返回
*/
@覆蓋
public boolean OnTouchEvent(MotionEvent事件){
//省略無關(guān)的代碼...
if(mVelocityTracker == null) {
mvelocity tracker = velocity tracker . get;
}
mVelocityTracker.addMovement(事件);
if(MotionEvent。ACTION_DOWN == event.getAction) {
//省略無關(guān)的代碼...
} elseif(MotionEvent。ACTION_MOVE == event.getAction) {
//省略無關(guān)的代碼...
} elseif(MotionEvent。ACTION_UP == event.getAction) {
//計算當(dāng)前速度,1000表示每秒像素等。
mvelocity tracker . computecurentvelocity(1000,mmaxiumvelocity);
//獲取橫向速度
intvelocity x =(int)mvelocity tracker . getxvelocity;
//速度應(yīng)大于滑動前的最小速度
if(Math.abs(velocityX)>;mmimumvelocity){
//省略無關(guān)的代碼...
}
if(mVelocityTracker!= null) {
mVelocityTracker.recycle
mVelocityTracker = null
}
}
returnsuper.onTouchEvent(事件);
}
在獲得水平速度后,我們需要執(zhí)行真正的投擲效果。用一個線程連續(xù)移動畫布,達到滾動的效果(RecycleView中的滾動也是通過線程實現(xiàn)的,感興趣的同學(xué)可以輸入RecycleView的源代碼來查看。線程類的名字是ViewFlinger)。
/**
*滾絲
*/
private class flinggrunnableimplementsrunnable {
privateScroller mScroller
privateintmInitX
privateintmMinX
privateintmMaxX
privateintmVelocityX
FlingRunnable(上下文上下文){
this . mscroller = NewsCroller(context,null,false);
}
void start(IntintX,
intvelocityX,
intminX,
intmaxX) {
this.mInitX = initX
this . mvelocity x = velocity x;
this.mMinX = minX
this.mMaxX = maxX
//先停止最后一個滾動
if(!mScroller.isFinished) {
mScroller.abortAnimation
}
//開始放縱
mScroller.fling(initX,0,velocityX,
0,0,maxX,0,0);
post(this);
}
@覆蓋
publicvoidrun{
//如果完成了,就不會再進行了
if(!mscroller . computescroloffset){
返回;
}
//計算偏移量
intcurrX = mScroller.getCurrX
int diffx = Minitx-CurX;
//用于記錄是否超出邊界。如果超出邊界,即使?jié)L動沒有完成,也不會進行回調(diào)。
booleanisEnd = false
if(DifX!= 0) {
//超出右邊界,進行修正
if(GetscrollX+DifX > 1;= mCanvasWidth - mViewWidth) {
diffX =(int)(mCanvasWidth-mViewWidth-getScrollX);
isEnd = true
}
//超出左邊界,改正
if(GetscrollX & lt;= 0) {
diffX =-getScrollX;
isEnd = true
}
if(!mScroller.isFinished) {
scrollBy(DifX,0);
}
mInitX = currX
}
if(!isEnd) {
post(this);
}
}
/**
*停止
*/
空隙停止{
if(!mScroller.isFinished) {
mScroller.abortAnimation
}
}
}
最后使用這個線程,使用的地方主要有兩點:一個手指按下時(即MotionEvent。動作向下)和手指抬起時(即運動事件)。ACTION_UP),刪除無關(guān)代碼,剩下的代碼如下。
public boolean OnTouchEvent(MotionEvent事件){
//省略無關(guān)的代碼...
if(MotionEvent。ACTION_DOWN == event.getAction) {
//省略無關(guān)的代碼...
mFling.stop
} elseif(MotionEvent。ACTION_MOVE == event.getAction) {
//省略無關(guān)的代碼...
} elseif(MotionEvent。ACTION_UP == event.getAction) {
//省略無關(guān)的代碼...
//速度應(yīng)大于滑動前的最小速度
if(Math.abs(velocityX)>;mmimumvelocity){
intinitX = getScrollX
int maxx =(int)(mCanvasWidth-mViewWidth);
if(MaxX & gt;0) {
mFling.start(initX,velocityX,initX,maxX);
}
}
//省略無關(guān)的代碼...
}
returnsuper.onTouchEvent(事件);
}
當(dāng)我們移動事件時。action _ down,我們需要停止?jié)L動,以便在手指接觸的地方立即停止。
當(dāng)我們移動事件時。action _ up,我們需要計算fling方法所需的最小值和最大值。根據(jù)我們在線程中的計算方法,我們的最小值和初始值是getScrollX,最大值是mCanvasWidth-mViewWidth。
課程設(shè)計的邏輯
常用Android控件的使用屬于Android開發(fā)的基礎(chǔ)知識,也是每個開始Android開發(fā)的學(xué)生必備的技能。
誰適合學(xué)習(xí)?
具備基本的Java/Android知識想要快速上手,走上Android開發(fā)之路的實習(xí)者怎么學(xué)?
極客學(xué)院將每天推出一門有限的免費課程,只需兩步就能輕松開始學(xué)習(xí):
注冊極客學(xué)院賬號,開啟學(xué)習(xí)之旅1.《velocitytracker 讓控件如此絲滑Scroller和VelocityTracker的API講解與實戰(zhàn)——Android高級UI》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《velocitytracker 讓控件如此絲滑Scroller和VelocityTracker的API講解與實戰(zhàn)——Android高級UI》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/guoji/1102473.html