1. 程式人生 > >Android 3種座標系、View在各座標系下獲取自身座標的方法、View的滑動和scroll方法

Android 3種座標系、View在各座標系下獲取自身座標的方法、View的滑動和scroll方法

注:理解View獲取自身座標或者說位置的各種方法重點在於考慮該方法獲取到的座標是相對於3種座標系中的哪種。

Android 3種座標系

Android 3種座標系都是以右、下方向為直角座標系x、y軸的正方向。此文介紹的都是二維直角座標系,不考慮 z 軸(z 軸以螢幕正上方的方向為正方向)。

一般來說,Android中存在三類座標:

螢幕座標:以螢幕的左上角為原點,水平向右為x軸正方向,豎直向下為y軸正方向。
佈局座標:以view的左上角為原點,水平向右為x軸正方向,豎直向下為y軸正方向。之所以稱之為佈局座標是因為view的左上角的位置是在view的layout過程中確定的。
檢視座標(繪製座標):檢視座標是view的draw過程中繪製內容時參考的座標。存在於一個抽象的畫布上。
在理解檢視座標上,很重要的一點是:draw過程中,我們的畫布是無限大的,畫布上有一個直角座標系,稱之為檢視座標。你可以以檢視座標為基準在畫布上隨便畫點啥。View的layout過程中的四個引數(l,t,r,b)確定了一個矩形框。矩形框在螢幕上且在螢幕上的位置一般是不會改變的,矩形框的左上角就是當前View的佈局座標。我們拿一個和這個矩形框一樣大小的另一個矩形框放到畫布上,其左上角與檢視座標重合,畫布上的矩形框在畫布上框住的內容就會繪製到螢幕上對應的矩形框。當呼叫scrollto或scollby方法時,畫布不動,畫布上的矩形框移動。這個過程中,檢視座標在畫布上的位置始終不變,佈局座標在螢幕上的位置始終不變。

打個比方:我們有一張小的白紙,對應於手機螢幕,白紙上畫了一個矩形,對應於手機上View layout過程確定的矩形框,其左上角對應於當前View的佈局座標。我們在地上放了一張超大的白紙,對應於上面的說的畫布,超大白紙上畫了一個直角座標系,相當於檢視座標。在超大白紙上方放了一個超大的紙板(不透明),紙板上有個矩形的洞,矩形的左上角與超大白紙的座標對齊。這個洞就對應於上面所說的畫布上的矩形框。當呼叫scrollto或者scrollby方法時,移動紙板。透過矩形框看見的內容,畫到小的白紙上的矩形框中,相當於顯示在了螢幕上。這個過程中,小的白紙上的佈局座標沒有變,大的白紙上的檢視座標也沒有變。

每個View都有自己的畫布和畫布上的檢視座標。畫布獨立於螢幕,和螢幕沒有直接關係。子View上顯示的內容會覆蓋父View上顯示的內容。

注:檢視座標和佈局座標的概念引用自Android核心剖析,除了這本書之外,博主還未見到其他地方有類似的定義。雖然這個座標系的分類沒有被廣泛的傳播,但是不可否認的是,這個座標體系很好,很清晰。這應該是scrollTo和scrollBy為什麼是“反的”的最好理論解釋了。
以上內容來源:Android View理論基礎之座標系

View在各座標系下獲取自身座標的方法

  1. 方法獲得的值以佈局座標為基準的:

    • View的getRight()、getTop()、getLeft()、getBottom()、getX()、getY()都是以該View的ParentView即父佈局的左上角為座標原點的;
    • View的getLocalVisibleRect()以自身在螢幕上的可視區域的左上角為座標原點獲取該可視區域的Rect;
    • View的getLocationInWindow()以該View所在的Window的左上角為座標原點;
    • View的getScrollX()、getScrollY()以View的左上角為座標原點;
    • MotionEvent的getX()、getY()以該觸控點所在的View的左上角為座標原點的;
  2. 方法獲得的值以螢幕座標為基準的:

    • View的getGlobalVisibleRect()以螢幕座標為基準獲取可視區域的Rect;
    • View的getLocationOnScreen();
    • MotionEvent的getRawX()、getRawY();

View的滑動

View的滑動方法:
1. 通過改變View的(x, y),即getX()、getY()得到的值。getX() = getLeft()+getTranslationX(),getY() = getTop()+getTranslationY()。因此改變(x, y):
一是改變View的getLeft()等的值。方法:重寫View的onTouchEvent方法並在其中利用layout(l, t, r, b)、offsetLeftAndRight(int offset)配合offsetTopAndBottom(int offset)、改變View的LayoutParams中的margin(間接改變l、t、r、b)這3種方法來達到滑動View的目的。
二是改變getTranslationX()、getTranslationY()的值。方法:動畫。
2. 通過移動View的父容器ParentView的內容。方法:重寫ParentView的onTouchEvent方法並在其中利用scroll方法來滑動整個ParentView的內容,從而達到滑動View的目的。
View滑動的具體實現參考:實現View滑動的七種方法
這裡主要講View的各種scroll方法。

View的scroll方法

滑動方法的呼叫者通常是ViewGroup如ScrollView。如:scrollView.setScrollX(100)。
滑動方法滑動的是View的內容而不是View本身。

  • View的getScrollX()、getScrollY()獲取的是View內容的當前滑動位置偏移量,具體就是getScrollX()獲得的是View左邊緣和View內容左邊緣在水平方向上的距離,getScrollY()獲得的則是View上邊緣和View內容上邊緣在垂直方向上的距離。

  • View的scrollTo()方法、scrollBy()方法。
    scrollTo(int x, int y)中的x、y是以該View的左上角為座標原點的,該方法的作用是將該View的左上角滑動到(x,y)的位置上。(注:這裡的View通常是ViewGroup如ScrollView,而(x,y)是在ViewGroup的整個內容尚未發生任何滑動前ViewGroup中某個View以該ViewGroup的左上角為座標原點下的座標。**該ViewGroup呼叫scrollTo(x,y)後,再呼叫該ViewGroup的getScrollX()、getScrollY()結果分別等於上面的x、y。**x、y為負數時表示內容沿x、y軸正方向移動,為正數時則相反。)
    scrollBy(int dx, int dy)中的dx、dy是指在x、y方向上分別上滑動dx、dy的距離。

  • View的setScrollX(int value)、setScrollY(int value) 分別相當於scrollTo(value, 0)、scrollTo(0, value)。

例子:ScrollView sv 中含有唯一的一個LinearLayout,而LinearLayout中含有TextView tv,將 tv 移動到ScrollView 的頂部,操作如下
int top = tv.getTop();
sv.scrollTo(0, top);
注:此例子中 top 是從 tv 到 LinearLayout頂部的距離,由於ScrollView 只能有一個子佈局,因此 top 也是 tv 到 ScrollView頂部的距離,若LinearLayout設有MarginTop 則還要加上MarginTop 的值。

ScrollView 通過getHeight()得到的是其在螢幕上矩形區域的高度。
ScrollView 的內容的高度不僅僅只是螢幕上看到的矩形區域的高度,其內容的高度的獲取可以通過如下方法:
int height = mScrollView.getChildAt(0).getBottom();
若ScrollView 唯一的子佈局設有 MarginBottom 則還要加上該值。
例子可參考:android之ScrollView滑動到指定的View

View的scroll方法可參考:Android座標

相關推薦

Android 3座標系View座標系獲取自身座標方法View滑動scroll方法

注:理解View獲取自身座標或者說位置的各種方法重點在於考慮該方法獲取到的座標是相對於3種座標系中的哪種。 Android 3種座標系 Android 3種座標系都是以右、下方向為直角座標系x、y軸的正方向。此文介紹的都是二維直角座標系,不考慮

androidView座標系view獲取自身座標方法點選事件中座標獲取

在做一個view背景特效的時候被座標的各個獲取方法搞暈了,幾篇抄來抄去的部落格也沒弄很清楚。 現在把整個總結一下。 其實只要把下面這張圖看明白就沒問題了。 涉及到的方法一共有下面幾個: view獲取自身座標:getLeft(),getTop(),getRigh

《人類簡史》八融合統一()——宗教的法則歷史的混沌

在前面,我們說了金錢和帝國,今天我們聊一聊宗教。宗教的話題算是比較敏感的,必定 很多人 是擁有自己的宗教信仰的,如果在下面的論述過程之中,讓您覺得有什麼不妥的地方,還希望能夠理解。我並沒有貶低或者蔑視任何宗教的意思。 我們今天提起宗教,很多人會首先聯想到歧視、爭端和分裂。但是

Android逐幀動畫,逐幀動畫載入圖片過多時OOM異常的解決替代方法

1.首先新增逐幀動畫 播放逐幀動畫,在工程中res目錄下建立一個anim資料夾,新增動畫anim_welcome.xml檔案如下: <?xml version="1.0" encoding="utf-8"?> <animation-li

Android系列之網路(三)----使用HttpClient傳送HTTP請求(分別通過GETPOST方法傳送資料)

 【正文】 在前兩篇文章中,我們學習到了和HTTP相關的基礎知識。文章連結如下: 一、GET和POST的對比: 在漫長的時間當中,其他的方法逐漸的退出了歷史舞臺,最常用的只剩下GET和POST方法。而之前已經講過了通過GET方法獲取資料,今天來學習一下如何分別通過

Android動畫View Animation(補間動畫) Drawable Animation(幀動畫) Property Animation(屬性動畫)(

轉載:http://blog.csdn.net/lmj623565791/article/details/38092093 三種動畫的優缺點: (1)Frame Animation(幀動畫)主要用於播放一幀幀準備好的圖片,類似GIF圖片,優點是使用簡單

OpenGLES Android篇零基礎系列(二):OpenGL座標系及模型矩陣(ModelViewMatrix),投影矩陣(ProjectionMatrix)等的深入理解

上一篇我們粗略的介紹了下GLES20 中 GLSurfaceView以及Render介面的使用。 對於三角形頂點座標的定義並沒有做出註釋,其實在官方的ApiDemo中,它也是赤裸裸的,一個註釋都沒有,且程式碼寫得一點都不敢恭維,不知道那位同行現在是不是還在go

Android方式實現三角形氣泡效果自定義Viewshape點9圖

背景 這期需求中,專案需要這樣一個情況,就是二級選單上面有個三角形 乍一看,用個圖片就可以解決,一個線性佈局、垂直襬下去,所以一開始我是這樣嘗試的,後來發現美工給我切的圖很不合適,不同手機顯示效果也不一樣,所以後來放棄了。以下是解決方案 使用.9圖

Volley的GetPost方式(JsonObjectRequestStringRequest)以及Volley獲取圖片的3方式

volley use utf-8 設置 ica static toast 隊列 getheight activity_main.xml 裏面什麽也沒有 AndroidManifest.xml(重點是android:name="com.example.vo

vue刷新當前路由:router-view 復用組件時不刷新的3解決方案總結

func 解決 變化 before bsp htm onos 影響 div   vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用於構建單頁面應用。vue的單頁面應用是基於路由和組件的,路由用於設定訪問路徑,並將路徑和組件映射起來。傳統的

vue專案實現按需載入的3方式:vue非同步元件es提案的import()webpack的require.ensure()

1. vue非同步元件技術 vue-router配置路由,使用vue的非同步元件技術,可以實現按需載入。 但是,這種情況下一個元件生成一個js檔案。 舉例如下: { path: '/promisedemo', na

vue重新整理當前路由:router-view 複用元件時不重新整理的3解決方案總結

vue-router是Vue.js官方的路由外掛,它和vue.js是深度整合的,適合用於構建單頁面應用。vue的單頁面應用是基於路由和元件的,路由用於設定訪問路徑,並將路徑和元件對映起來。傳統的頁面應用,是用一些超連結來實現頁面切換和跳轉的。在vue-router單頁面應用中,則是路徑之間的切換,也

pycharm中指令碼執行的3模式(unittest框架pytest框架普通模式)

背景知識,某次使用HTMLTestRunner的時候,發現一直都無法匯出報告,後來查詢資料發現了一些坑,現在整理一下來龍去脈。 一:pycharm預設的是pytest框架去執行unittest框架的測試用例 import unittest class AlienTest(unitte

HTML+CSS第六課:初識CSS之CSS選擇器的使用為HTML文件新增CSS樣式的3方式

知識點:CSS的概念及語法、CSS選擇器的使用、CSS選擇器的優先順序、新增CSS樣式的3種方式。 1、CSS概念理解         CSS 是Cascading Style Sheet的縮寫,可以翻譯為“層疊樣式表”或者“級聯樣式表”,即“樣式

各種經緯度座標系轉換-百度座標系火星座標系國際座標系

(文章程式碼參考網上 測試沒什麼問題, 彙總整理希望對大家有幫助-dou ) WGS84:國際座標系,為一種大地座標系,也是目前廣泛使用的GPS全球衛星定位系統使用的座標系。 GCJ02:火星座標系,是由中國國家測繪局制訂的地理資訊系統的座標系統。由WGS84座標系經加密後的座標系。 BD

機器人學筆記之——空間描述變換:位置姿態與座標系

0.空間描述:位置、姿態與座標系 0.0 位置描述: 位置描述這個沒什麼好說的,就是用矩陣的方式表示空間座標系中的向量,如上圖,在座標系{A}中有向量 aP ,其矩陣表示如下圖,其數值就是向量在當前座標系下的模長。 0.1 姿態描述: 我們可以很直觀地明白一個道理,在空間

C# 呼叫WebService的3方式 :直接呼叫根據wsdl生成webservice的.cs檔案及生成dll呼叫動態呼叫

1.直接呼叫 已知webservice路徑,則可以直接 新增服務引用--高階--新增web引用 直接輸入webservice URL。這個比較常見也很簡單 即有完整的webservice檔案目錄如下圖所示, 也可以在本地IIS根據webservice檔案目錄新發佈一個webserv

自定義Android Gradle外掛的3方式

      因為gradle外掛是在編譯過程中生效, 不用修改程式碼就能實現很多功能, 幾乎每個app都使用了gradle外掛。 下面就介紹一下自定義gradle外掛的3種方式。      按照官網說明, 分為3種方式。 1、Build script, 即在專案中的b

Android View原理解析之基礎知識(MeasureSpecDecorViewViewRootImpl)

提示:本文的原始碼均取自Android 7.0(API 24) 前言 自定義View是Android進階路線上必須攻克的難題,而在這之前就應該先對View的工作原理有一個系統的理解。本系列將分為4篇部落格進行講解,本文將主要對MeasureSpec、DecorV

分散式鎖的3實現(資料庫快取Zookeeper)

分散式鎖的幾種實現方式 目前幾乎很多大型網站及應用都是分散式部署的,分散式場景中的資料一致性問題一直是一個比較重要的話題。 分散式的CAP理論告訴我們,任何一個分散式系統都無法同時滿足一致性(Consistency)、可用性(Availability)和分割槽容錯性(