<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
實現View滑動有很多種方法,這篇貼文介紹6中滑動的方法,分別是:
layout()、offsetLeftAndRight()、offsetTopAndBottom()、LayoutParams、scrollTo、scrollBy、Scroller。
繪製View的時候會呼叫onLayout方法來設定顯示的位置,因此我們同樣也可以通過修改View的left、top、right、bottom、這四個屬性來控制View的座標。首先我們要自定義一個View在onTouchEvent方法中獲取觸控點的座標:
@Override public boolean onTouchEvent(MotionEvent event) { //獲取手指觸控點的橫座標和縱座標 int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; } .... }
接下來我們在ACTION_MOVE事件中計算偏移量,再呼叫layout方法重新放置這個自定義View的位置。
case MotionEvent.ACTION_MOVE: //計算移動的距離 int offsetX = x - lastX; int offsetY = y - lastY; //呼叫layout方法來重新放置它 layout(getLeft() - offsetX, getTop() + offsetY, getRight() - offsetX, getBottom() - offsetY); break;
在每次移動時都會呼叫layout方法對螢幕重新佈局,從而達到移動View的效果。
其這兩種方法和layout方法效果差不多,其使用方法也差不多。我們將ACTION_MOVE中的程式碼替代如下:
case MotionEvent.ACTION_MOVE: //計算移動的距離 int offsetX = x - lastX; int offsetY = y - lastY; //對left和right進行偏移 offsetLeftAndRight(offsetX); //對top和bottom進行偏移 offsetTopAndBottom(offsetY); break;
LayoutParms 主要儲存了一個View的佈局引數 , 因此我們可以通過LayoutParams來改變View的採納數;從而達到改變View位置的效果。同樣,我們將ACTION_MOVE中的程式碼替換如下:
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams(); layoutParams.leftMargin = getLeft() + offsetX; layoutParams.topMargin = getLeft() + offsetY; setLayoutParams(layoutParams);
scrollTo(x,y) 表示移動到一個具體的座標點,而scrollBy(dx.dy)則表示移動的增量為dx,dy。
其中,scrollBy最終也是要呼叫scrollTo的。View.java檔案中的scrollBy和scrollTo程式碼如下:
scrollTo、scrollBy 移動的是View的內容,如果在ViewGroup中使用,則是移動其所有的子View,我們將ACTION_MOVE中的程式碼替換如下:
((View) getParent()).scrollBy(-offsetX, -offsetY);
這裡若要實現View隨手指移動的效果,則需要將偏移量設定為負值,為什麼要設定負值呢?
假設我們正在用放大鏡來看報紙,放大鏡用來顯示子的內容,同樣我們可以吧放大鏡看作我們的手機螢幕,它們都是負責顯示內容,也就是報紙的內容不會隨著放大鏡的移動而消失,它一直存在,同樣,我們的手機螢幕看不到的檢視並不代表其不存在,上圖畫布中有3個控制元件,及Button、EditText和SwitchButton。只有Button在螢幕中顯示,它的Android座標為(60,60)。現在我們呼叫scrollBy(50,50),按照字面的意思,這個Button應該會在螢幕右下側,可事實並非如此。如果我們呼叫scrollBy(50,50)裡面的引數都會正值,則我們的手機螢幕想X軸正方向,也就是右邊平移50然後螢幕向Y正方向,也就是下方平移50,雖然我們設定的數值是正數並且在X軸和Y軸的正方向移動,但Button卻向反方向移動了,這就是參考物件不同導致的差異。
所以,當我們使用scrollBy方法的時候,要是設定負數才會達到自己想要的效果。
我們在用scrollTo/scrollBy方法進行滑動時,這個過程是瞬間完成的,所以使用者體驗並不好,這裡我們可以使用Scroller來實現有過度效果的滑動,這個過程不是瞬間完成的,而是在一定的時間間隔內完成的。Scroller本身不能實現View的滑動,它需要與View的computeScroll方法配合才能實現彈性滑動效果
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mScroller = new Scroller(context); }
接下來重寫computeScroll方法,系統會在繪製View的時候在draw方法中呼叫該方法,在這個方法中,我們呼叫父類別的scrollTo方法並通過Scroller來不斷獲取當前的滑動值。每滑動一小段距離,我們就會呼叫invalidate方法不斷的進行重繪。重繪就會呼叫computeScroll方法,這樣我們通過不斷地移動一個小的距離並連貫起來就實現了平滑移動的效果。
@Override public void computeScroll() { super.computeScroll(); if (mScroller.computeScrollOffset()) { ((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); invalidate(); } }
我們會在View中寫一個smoothScrollTo方法,呼叫Scroller的startScroll方法,在200ms內沿X軸平移delta畫素
public void smoothScrollTo(int destX, int destY) { int scrollX = getScrollX(); int delta = destX - scrollX; mScroller.startScroll(scrollX, 0, delta, 0, 2000); invalidate(); }
最後我們在ViewSlideActivity.Java中呼叫View的smoothScrollTo方法。在此我們設定View沿V軸向右平移400畫素
mCustomView.smoothScrollTo(-400,0);
到此這篇關於Android View滑動的實現分析範例的文章就介紹到這了,更多相關Android View滑動內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45