1. 程式人生 > >Android自定義View之基礎篇——座標系

Android自定義View之基礎篇——座標系

1、前言

手機螢幕座標系與數學座標系的不同,主要留意y軸方向。

2、手機座標系

(1)螢幕座標系/Android座標系

以螢幕左上角為原點。如圖所示,圖中綠色邊框位置為螢幕所在區域,其中綠色邊框左上角為原點。

(2)View座標系

如圖,手機螢幕區域,即上圖綠色邊框圍裹部分,可分為狀態列(即wifi訊號、電量顯示區)、標題欄、View可繪製區域。其中,標題欄和可繪製區域為我們的APP應用區域。

View的座標是相對父容器而言的,以相對父容器的左上角為原點。上圖中可繪製區域(褐色邊框部分)的左上角位置,就是整個座標系統的原點。

3、View座標系詳解

            

關於上面ABCD點的座標,先普及一下知識:

View的座標方法

解釋

getLeft()

返回View自身左邊到父佈局左邊的距離

getTop()

返回View自身頂邊到父佈局頂邊的距離

getRight()

返回View自身右邊到父佈局左邊的距離

getBottom()

返回View自身底邊到父佈局頂邊的距離

getX()

返回值為getLeft()+getTranslationX(),當setTranslationX()時getLeft()不變,getX()變。

getY()

返回值為getTop()+getTranslationY(),當setTranslationY()時getTop()不變,getY()變。

getLocationOnScreen() 

獲取view在當前螢幕內的絕對座標(Android座標系,包含狀態列和標題欄)

getLocationInWindow () 

獲取view在其父佈局中的相對座標

這樣,我們就可以算出它們的座標(該控制元件的父佈局是根佈局,所以可以看做是在螢幕中的座標)了。

A( view.getLeft() , view.getTop())、B( view.getRight() , view.getTop())、

C( view.getLeft()  , view.getBottom())、D( view.getRight() , view.getBottom())

同樣的,我們可以算出A1B1C1D1相對於父佈局ViewGroup的座標。

!注意:

    ① 前面四個方法獲取的不是在螢幕中的座標,是相對於父控制元件的相對座標(原始的位置);

    ② getX()和getY(),主要用於獲取控制元件移動後的相對位置(視覺上的位置),但是並非View的座標直接加減移動距離。eg.

view.setTranslationX(100),view向右移動了100,但是這只是視覺上的移動,真實位置不變,所以獲取視覺上的位置不能用原先的getLeft()+100,這是錯誤的,而是得用getX()。

    ③ getLocationOnScreen()與getLocationInWindow()獲取的時機:

    必須在窗體獲得焦點之後才可以,否則返回為空。我們可以複寫Activity的onWindowFocusChanged()方法,在該方法體內獲取具體的座標。網上還提供了另外一種方法,連結

MotionEvent相關方法 解釋
getX() 當前觸控點距離當前View左邊的距離
getY() 當前觸控點距離當前View頂邊的距離
getRawX() 當前觸控點距離整個螢幕左邊的距離(不管App是否有狀態列、全屏等)
getRawY() 當前觸控點距離整個螢幕頂邊的距離(不管App是否有狀態列、全屏等)

注意:這裡的螢幕,指的是螢幕顯示區,而不是整個手機介面,見上面的螢幕座標系。

4、參考連結

相關推薦

Android定義View基礎——座標系

1、前言 手機螢幕座標系與數學座標系的不同,主要留意y軸方向。 2、手機座標系 (1)螢幕座標系/Android座標系 以螢幕左上角為原點。如圖所示,圖中綠色邊框位置為螢幕所在區域,其中綠色邊框左上角為原點。 (2)View座標系 如圖,手機螢幕區域,即上

Android 定義View繪圖工具類Canvas+Paint+Path(onDraw方法)基礎詳解

本章節講述三個繪圖工具類Canvas(畫布),Paint(畫筆),Path(路徑) 1.Canvas(畫布)相關方法詳解 1.1. 方法:Canvas() 作用:建立一個空的畫布,可以使

Android定義View分貝儀

一、說明        最近在整理自定義View方面的知識,偶爾看到meizu工具箱的分貝儀效果,感覺它的實效效果還挺好的,遂想自己模擬實現練練手,廢話不多說,直接開擼。 二、效果圖 首先看一下效果圖: 看效果還挺炫酷

Android定義ViewCanvas

https://www.jianshu.com/p/fb18c28d6627 用繼承View的方式來自定義View,我們就需要重寫onDraw方法,也就是得咱自己來畫圖了。畫圖就得用到畫筆和畫布,也就是Paint和Canvas。我們來了解下Canvas。 Canvas Canvas我們可

Android 定義ViewCanvas詳解

自定義View的相關文章: Android 實現一個簡單的自定義View Android 自定義View步驟 Android Paint詳解 Android 自定義View之Canvas相關方法說明 Android 自定義View例項之 “京東跑”

Android : 定義View流式佈局

寫了一個很簡單的佈局 這是周圍圓框的drawable <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android">

android定義View仿通訊錄側邊欄滑動,實現A-Z字母檢索

我們的手機通訊錄一般都有這樣的效果,如下圖: OK,這種效果大家都見得多了,基本上所有的android手機通訊錄都有這樣的效果。那我們今天就來看看這個效果該怎麼實現。 一.概述 1.頁面功能分析 整體上來說,左邊是一個ListView,右邊是一個自定義View,但

Android定義View-Measure原理

在自定義View中有時需要測量View的尺寸,因此,瞭解View的Measure過成有助於我們開發自定義View。 一、目的:測量View的寬與高 在有些情況下,需要多次測量(measure)才能夠最終確定View的寬高(比如父檢視MeasureSpec使用UNSPECI

Android定義View-Layout原理

Android自定義View通常需要經過measure、layout和draw過程,如果你沒有了解過measure過程,可以先看看這篇文章。 一、Layout的作用:計算檢視的位置,即Left、Top、Right、Bottom四點的位置 二、layout過程:跟measu

Android定義ViewgetTextBounds()

在Android自定義View的過程中一定會用到Paint,而paint屬性中有一個方法getTextBounds(String text,int start,int end,Rext bounds),它的中文解釋是:返回一個包含中文的矩形邊界,位置為(start,end) 英文解釋:Retur

Android定義View定義屬性

在Android開發中經常會用到自定義View的情況,而在自定義View時,自定義屬性是必須用到的。 1、新建一個自定義View如CustomView 它的自定義屬性主要是通過declare-styleable標籤為其配置自定義屬性。具體做法是:在res/values/目錄下增加一個reso

Android -- 定義viewStepView

先看看實現的效果: 2,首先我們來看看我們常規的自定義view的基礎步驟吧         1,繼承View,重寫構造方法 2,自定義屬性 3,重寫onMeasure()測量控制元件高度 4,重寫onDra

Android 定義View 可隨意拖動的View

因為趕專案本人停更兩個月 從今天開始又可以更新了 今天說一下這個可隨意拖動的view 簡單說一下這個view效果 和 發展 一開始這種效果是使用在網頁端的特別是購物類 例如某寶 某東 購物車和客服視窗 都有使用這個懸浮可拖動的設計效果 後來才發展到的移動端 還有

Android 定義View咖啡動畫

文章目錄效果畫杯子畫杯墊畫煙霧 效果 大概思路 自定義view,直接繼承view 複寫onSizeChanged()方法,在此計算杯墊,杯子,煙霧效果的path 在onDraw()方法中,描繪杯墊,杯子 處理煙霧動畫效果 畫杯子 這裡需要畫兩部分內容,第

Android 定義View下雨動畫

文章目錄效果思路畫雲畫雨滴優化 效果 開始前先做個熱身( ˘•灬•˘ ) 自己實現比較容易,但是到了要出部落格整理思路,總結要點的時候就撓頭,不知雲所以,所以最簡單的還是 如果對安卓UI有興趣的朋友可以加我好友互相探討, 思路 思路比較簡單,整個view無

android定義View定義EditText(新增刪除功能)

           忙忙碌碌20天,新的專案終於接近尾聲了。今天公司召集幾個使用者體驗師和美工一起吐糟這20天做的這個新產品,對於產品提出了很多建議,這幾天就改介面了。在這個專案中大量的使用了EditText元件,並且添加了刪除功能。這裡面都是用RelativeLayou

android定義view畫圓隨著手指移動

public class MyView extends View { private Paint mFanPaint,mTextPaint;//扇形畫筆和文字畫筆 public float AxisX=100; public float AxisY=100; public MyView(

Android定義view實現帶checkbox的Snackbar

前言 最近專案要求實現一個類似於snackbar功能,但是又不完全是snackbar的外掛,本來想在Google提供的snackbar裡面進行更改,但是這樣太麻煩了,於是自己動手實現了一個snackbar。先看下效果圖: 1.要解決的問題 1.彈框裡面除了文字提示之外還有一個按鈕,這個按

android定義View3D索引效果

效果圖: 我的小霸王太卡了。 最近工作比較忙,今天搞了一下午才搞出來這個效果,這種效果有很多種實現方式,最常見的應該是用貝塞爾曲線實現的。今天我們來看另一種不同的實現方式,只需要用到 canvas.scale(),有沒有很好奇是怎麼實現的呢。 首先來說一下思路,只要有了思

android 定義view側滑效果

效果圖: 看網上的都是兩個view拼接,預設右側的不顯示,水平移動的時候把右側的view顯示出來。但是看最新版QQ上的效果不是這樣的,但給人的感覺卻很好,所以獻醜來一發比較高仿的。 知識點: 1、ViewDragHelper 的用法; 2、滑動衝突的解決; 3、自定