1. 程式人生 > >圖解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

圖解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

Android系統手機螢幕的左上角為座標系,同時y軸方向與笛卡爾座標系的y軸方向想反。通過提供的api如getLeft , getTopgetBottomgetRight可以獲得控制元件在parent中的相對位置。同時,也可以獲得控制元件在螢幕中的絕對位置,詳細用法可參考

當我們編寫一些自定義的滑動控制元件時,會用到一些api如scrollTo(),scrollBy(),getScrollX(), getScrollY()。由於常常會對函式getScrollX(), getScrollY()返回的值的含義產生混淆,尤其是正負關係,因此本文將使用幾幅圖來對這些函式進行講解以方便大家記憶。

注意:呼叫View的scrollTo()和scrollBy()是用於滑動View中的內容,而不是把某個View的位置進行改變。如果想改變莫個View在螢幕中的位置,可以使用如下的方法。

呼叫public void offsetLeftAndRight(int offset)用於左右移動方法或public void (int offset)用於上下移動。

                 如:button.offsetLeftAndRignt(300)表示將button控制元件向左移動300個畫素。

scrollTo(int x, int y) 是將View中內容滑動到相應的位置,參考的座標系原點為parent View的左上角。

       呼叫scrollTo(100, 0)表示將View中的內容移動到x = 100, y = 0的位置,如下圖所示。注意,圖中黃色矩形區域表示的是一個parent View,綠色虛線矩形為parent view中的內容。一般情況下兩者的大小一致,本文為了顯示方便,將虛線框畫小了一點。圖中的黃色區域的位置始終不變,發生位置變化的是顯示的內容。


 同理,scrollTo(0, 100)的效果如下圖所示:


scrollTo(100, 100)的效果圖如下:

若函式中引數為負值,則子View的移動方向將相反。

scrollBy(int x, int y)其實是對scrollTo的包裝,移動的是相當位置。 scrollTo(int x, int y)的原始碼和scrollBy(int x, int y)原始碼如下所示.

    /**
     * Move the scrolled position of your view. This will cause a call to
     * {@link #onScrollChanged(int, int, int, int)} and the view will be
     * invalidated.
     * @param x the amount of pixels to scroll by horizontally<pre name="code" class="java">    /**
     * Set the scrolled position of your view. This will cause a call to
     * {@link #onScrollChanged(int, int, int, int)} and the view will be
     * invalidated.
     * @param x the x position to scroll to
     * @param y the y position to scroll to
     */
    public void scrollTo(int x, int y) {
        if (mScrollX != x || mScrollY != y) {
            int oldX = mScrollX;
            int oldY = mScrollY;
            mScrollX = x;
            mScrollY = y;
            invalidateParentCaches();
            onScrollChanged(mScrollX, mScrollY, oldX, oldY);
            if (!awakenScrollBars()) {
                postInvalidateOnAnimation();
            }
        }
    }
/* @param y the amount of pixels to scroll by vertically */ 
public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); }


可見,mScrollX和mScrollY是View類中專門用於記錄滑動位置的變數。這兩個函式最終呼叫onScrollChanged()函式,感興趣者可以參考他們的原始碼。

理解了scrollTo(int x, int y)和scrollBy(int x, int y)的用法,就不難理解getScrollX() 和getScrollY()。這兩個函式的原始碼如下所示:

    /**
     * Return the scrolled left position of this view. This is the left edge of
     * the displayed part of your view. You do not need to draw any pixels
     * farther left, since those are outside of the frame of your view on
     * screen.
     *
     * @return The left edge of the displayed part of your view, in pixels.
     */
    public final int getScrollX() {
        return mScrollX;
    }

    /**
     * Return the scrolled top position of this view. This is the top edge of
     * the displayed part of your view. You do not need to draw any pixels above
     * it, since those are outside of the frame of your view on screen.
     *
     * @return The top edge of the displayed part of your view, in pixels.
     */
    public final int getScrollY() {
        return mScrollY;
    }


相關推薦

圖解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

Android系統手機螢幕的左上角為座標系,同時y軸方向與笛卡爾座標系的y軸方向想反。通過提供的api如getLeft , getTop, getBottom, getRight可以獲得控制元件在parent中的相對位置。同時,也可以獲得控制元件在螢幕中的絕對位置,詳細用法

Android scrollTo() scrollBy() Scroller解說及應用

render 設置 pop generate gnu 結束 last androi nds 版本號:1.0 日期:2014.6.17 2014.6.18版權:? 2014 kince 轉載註明出處 scrollTo() 、scrollBy()及 Scroller在視圖

圖解 Android 事件分發機制 和 handler 機制

在Android開發中,事件分發機制是一塊Android比較重要的知識體系,瞭解並熟悉整套的分發機制有助於更好的分析各種點選滑動失效問題,更好去擴充套件控制元件的事件功能和開發自定義控制元件,同時事件分發機制也是Android面試必問考點之一,如果你能把下面的一些事件分發圖當場畫出來肯定加分不少。廢

Android 滑動scrollBy()和scrollTo()兩個方法的簡單認識

涉及到滑動,就涉及到VIEW,大家都知道,Android的UI介面都是由一個一個的View以及View的派生類組成,View作為基類,而常用的佈局裡面的各種佈局就是它派生出來的ViewGroup的子類,ViewGroup作為各個元件的容器搭建了整體的UI。以下是andro

[譯]圖解Android應用的後臺任務和提醒

對於很多應用而言,構建後臺任務是重要的一環。其中一種方式是:使用AlarmManager註冊定時器喚醒未在前臺啟動的應用(例如鬧鐘,譯者注)。如何優雅低使用定時器類和API,它們是不是你的最佳選擇?下面讓我們看看如何抉擇。 喚醒頻率? 對於少於60秒的喚

圖解 Android 動畫中 android:pivotX 和 android:pivotY 屬性的含義

在 Android 動畫中,縮放動畫(scale標籤)和旋轉動畫(rotate標籤)均有 android:pivotX 和 android:pivotY 這兩個屬性,其值可以有多種形式,並不是很好理解。本文就用一個小 Demo 來展示這兩個屬性的含義,相信看了之

scrollTo、scrollBygetScrollXgetScrollY這4個方法的含義android檢視、座標原理

結合程式和圖作出說明: 1、關於自定義檢視繼承ViewGroup中的onMeasure和onLayout是怎麼實現我就不多說了,此博文主要是說明scrollTo、scrollBy、getScrollX、getScrollY這4個方法的含義。 2、整個座標系是以手機

Android 事件分發機制 圖解

ack 理解 cnblogs png ont tor 自己的 block ans 在Android 開發中事件分發是比較重要的,也是比較難理解的,之前看過這方面的東西,以為自己弄懂了,也就沒太註意,最近面試呢,想著肯定要問到這一塊的東西,回顧的時候發現

Delphi XE5 圖解Android應用制作簽名

icon har 設置 font option tor creat lan class http://redboy136.blog.163.com/blog/static/107188432201381872820132 Delphi XE5 圖解為Android應用制

圖解Android Studio項目文件結構各部分作用

info 感激 初學 分享圖片 post 作用 圖片 andro 整理 初學Android在閱讀<第一行代碼>的時候整理出來的,如果差錯懇請指出,不勝感激。 制圖不易,轉載請標註出處,謝謝。一圖解明Android Studio項目文件結構各部分作用

Android圖解四種啟動模式 及 實際應用場景解說

類型 placed data val add The avi 能夠 per 在一個項目中會包括著多個Activity,系統中使用任務棧來存儲創建的Activity實例,任務棧是一種“後進先出”的棧結構。舉個栗子,若我們多次啟動同一個Activity。系統會創建多個實例依次放

Android註冊程式編寫(一)之圖解程式設計

Android註冊程式編寫(一) (作者:Baron_wu 禁止轉載) 介面設計 首先進入Androidstudio建立一個空的工程: 選擇要執行的裝置: 選擇一個空的活動: 為app命名: 之後進入主介面: 點選紅筆畫中的視窗進入介面設計視窗: 介面設計視窗如下

Android自動化壓力測試圖解教程——Monkey工具

有時候我們需要對一個軟體進行壓力測試,檢查該軟體的效能。如果是人工進行測試的話,效率會低很多,而且會比較枯燥。這時,Android中的一個命令列工具Monkey就可以為我們減輕很多重複而又繁瑣的工作。         一、Monkey簡介       至於Monkey的名

Android Scroller、scrollBy和scrollTo

先說座標系 檢視座標 Android view的檢視是沒有邊界的,也就是說canvas是沒有邊界的,可以無限繪製, 那麼這種無邊界的座標被成為檢視座標。(絕對座標,座標原點為螢幕左上角) 佈局座標 也交相對座標,在View Layout時以當前view的左上角

圖解MyEclipse 8.5M1中Android開發平臺的搭建【下】

MyEclipse 8.5M1中搭建Android開發平臺 1、下載Android Development Tools(ADT),直接到這裡去下載Android ADT最新外掛 10.0.0的: 下載下來之後,把plugins和features放到MyEclipse的drop

Android環境變數的設定(詳細圖解版)- path

(注:android sdk的安裝路徑配置 最好用別的 因為ANDROID_SDK_HOME常常設定為xxxavd檔案路徑) 查閱了網上很多的資料但是對於環境變數設定介紹的不夠詳細,可能對於大蝦來說是不屑看的,但是對於剛入門的小菜鳥還是比較高深的,呵呵。    

Android Studio製作library(圖解

一、從專案中右鍵新增一個新的library。 第一步:到Android目錄下,右鍵->new->Module。 如下圖 第二步: 選中Android Library,下一步 輸入包名什麼的,finish 第三步:讓工程編譯這個library,有手動新增或者

Android Studio各種情況下匯入library的教程(圖解

Android Studio是谷歌力推的開發工具,匯入library還是跟傳統的Eclipse有很大區別的。 一、jar包 第一步,project目錄下的libs,把jar往裡面拷貝。如下圖: 第二步,切換到Android目錄,開啟build.gradle(Module:

Android框架MVC、MVP和MVVM探究(圖解+案例+附原始碼)

1、介紹 MVC、MVP、MVVM這些模式是為了解決開發過程中的實際問題而提出來的,目前作為主流的幾種架構模式而被廣泛使用。本文程式碼 2、瞭解並區分MVC,MVP,MVVM 2.1 MVC MVC,(Model View Controller)

Android 座標系與檢視座標系圖解

1.Android座標系 在Android中,將螢幕的最左上角頂點作為Android座標系的原點 從原點向右是X軸的正方向,從原點向下是Y軸的正方向 View提供了getLocationOnScreen( int[] location)方法來獲取在整個