1. 程式人生 > >Android Scroll分析(一)

Android Scroll分析(一)

1.滑動一個view,實質上就是移動一個view,改變其所處的位置,原理與動畫效果的實現非常相似,都是通過不斷的改變view的座標來實現這一效果。所以要實現view的滑動,就必須監聽使用者的觸控事件,並且根據事件傳入的座標,動態且不斷的改變view的座標,從而實現view隨使用者的滑動而滑動。

2.Android座標系

在Android中,將螢幕的最左上角的頂點作為Android座標系的原點,從這個點向右是X軸的正方向,從這個點向下是Y軸的正方向。如圖所示:
Android座標系

系統提供了 getLocationOnScreen(int location[])這樣的方法來獲取android座標系中點的的位置,即該檢視左上角在android座標系中的座標。另外在觸控事件中使用getRawX(),getRawY()方法獲取android座標系中的座標。

3.檢視座標系

除了上述所說的座標系之外,還有一種檢視座標系,它描述了子檢視在父檢視中的位置關係,這兩種座標系不矛盾也不復雜,他們的作用是相輔相成的。與android座標系類似,檢視座標系同樣是一原點向右是X軸正方向,以原點向下為Y軸正方向,只不過在檢視座標系中,原地單不再是android座標系中的螢幕最左上角,而是以父檢視左上角為座標原點,如圖所示:
檢視座標系

在觸控事件中,通過getY(),getX()所獲得的座標就是檢視座標系中的座標。

3.觸控事件

觸控事件MotionEvent中封裝了一些常用的事件常量,它定義了不同的觸控事件的不同型別。

public static
final int ACTION_DOWN = 0; // 按下 public static final int ACTION_UP = 1; // 擡起 public static final int ACTION_MOVE = 2; // 移動 public static final int ACTION_CANCEL = 3; // 取消觸控動作 public static final int ACTION_OUTSIDE = 4; //動作超出邊界 public static final int ACTION_POINTER_DOWN = 5; // 多點按下
public static final int ACTION_POINTER_UP = 6; // 多點擡起 public static final int ACTION_HOVER_MOVE = 7; // 滑鼠在view上移動 public static final int ACTION_SCROLL = 8; //非觸控滾動,主要是由滑鼠、滾輪、軌跡球觸發 .........(不一一列舉)

通常情況下我們會在

 @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }

中通過event.getAction()方法來獲取到觸控事件的型別,並且用switch-case方法來進行篩選。

以下是單點觸控事件的模板:

@Override
    public boolean onTouchEvent(MotionEvent event) {
    // 獲取當前輸入點的X,Y座標(檢視座標)
        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
            // 按下
                break;
            case MotionEvent.ACTION_MOVE:
            // 移動
                break;
            case MotionEvent.ACTION_DOWN:
            // 擡起
                break;
        }
        return true;
    }

在Android中,系統提供了很多的方法來獲取座標值,相對距離等。下圖表示了獲取座標值的各種方法:
獲取座標的各種方法

view提供的獲取座標的方法:

getTop(): 獲取到的是view自身的頂邊到其父佈局頂邊的距離;
getLeft(): 獲取到的是view自身的左邊到其父佈局左邊的距離;
getRight():獲取到的是view自身的右邊到其父佈局左邊的距離;
getBotton():獲取到的是view自身的底邊到其父佈局頂邊的距離;

MotionEvent提供的方法:

getX():點選的點距離控制元件左邊的距離,即檢視座標
getY():點選的點距離控制元件頂邊的距離,即檢視座標
getRawX():點選的點距離整個螢幕左邊的距離,即絕對座標
getRawY():點選的點距離整個螢幕頂邊的距離,即絕對座標

相關推薦

Android Scroll分析滑動效果產生分析

滑動一個View,本質上來說就是移動一個View。改變其當前所處的位置,它的原理與動畫效果的實現非常相似,都是通過不斷地改變View的座標來實現這一效果。所以,要實現View的滑動,就必須監聽使用者觸控的事件,並根據事件傳入的座標,動態且不斷地改變View的座標

Android Scroll分析

1.滑動一個view,實質上就是移動一個view,改變其所處的位置,原理與動畫效果的實現非常相似,都是通過不斷的改變view的座標來實現這一效果。所以要實現view的滑動,就必須監聽使用者的觸控事件,並且根據事件傳入的座標,動態且不斷的改變view的座標,從而實

Android多媒體分析MediaScanner

Android平臺上的媒體檔案管理和桌面系統不同。在桌面系統上,不同目錄下的媒體檔案呈樹狀結構顯示給使用者,使用者需要進入不同目錄尋找該目錄下的檔案。而在Android平臺上,不同目錄下的媒體檔案

Android系統播放器MediaPlayer原始碼分析

前言 對於MediaPlayer播放器的原始碼分析內容相對來說比較多,會從Java->JNI->C/C++慢慢分析,後面會慢慢更新。另外,部落格只作為自己學習記錄的一種方式,對於其他的不過多的評論。 MediaPlayerDemo public class MainA

Android跨程序通訊Binder原理分析

文章目錄 1. Linux程序基礎 1.1 程序隔離 1.2 使用者空間/核心空間 1.3 核心模組/驅動 1.4 圖解 2. 為什麼要使用Binder 2.1 安全方面 2.2 效能方面(一

自編譯安卓系統分析Android核心漏洞

目標 編譯Android4.4.3-r1原始碼及核心 0x00 環境 手機環境: nexus5 + Kernel3.4.0+Android4.4.3_r1 虛擬機器編譯環境: Vmware + Ubuntu 14.04 0x01 編

Android recyclerview原始碼分析

原始碼分析基於22.2.1版本 先預覽一下recyclerview 相關的類   今天先分析SortedList 和SortedListAdapterCallback 先看下這兩個類的用法  SortedList<Object> mDataList=new

Android手機病毒分析

筆者剛剛做過三個月的手機病毒分析師,主要工作做的就是靜態分析可疑的手機APP,找出這些手機應用侵害手機使用者的證據,現在想把這些工作總結一下,分享出來。不足之處,歡迎指正。(這裡的病毒不是我們一般意義上的病毒,而是侵害到手機使用者的惡意APP。) 逆向 我們

Android SharedPreference 原始碼分析

1. 前言 眾所周知,SharedPreferences是Android平臺上一個輕量級的儲存類,用來儲存應用的一些常用配置,比如Activity狀態,Activity暫停時,將此activity的狀態儲存到SharedPereferences中;當Activ

Android效能優化App啟動原理分析及啟動時間優化

一、啟動原理解析 Android是基於Linux核心的,當手機啟動,載入完Linux核心後,會由Linux系統的init祖先程序fork出Zygote程序,所有的Android應用程式程序以及系統服務程序都是這個Zygote的子程序(由它fork出來的)。其中最重要的一個就

Android 8.0 RIL原始碼分析

1.去電流程三中跟蹤到最後的時候可以看到其呼叫了RIL的dail方法 這裡繼續以此分析其從RIL到Modem的流程 @Override public void dial(String address, int clirMode, UUSInfo

Android OTA升級原理和流程分析

這篇及以後的篇幅將通過分析update.zip包在具體Android系統升級的過程,來理解Android系統中Recovery模式服務的工作原理。我們先從update.zip包的製作開始,然後是Android系統的啟動模式分析,Recovery工作原理,如何從

phonegap原始碼分析------ android

Phonegap已把原始碼提交到apache,成為一個非常受關注的開源框架cordova,它的跨平臺的特性有點當年Java的味道和勢頭,成為移動平臺上比較主流的解決方案。今日品味了一下它在android端的原始碼,看看它到底是如何結合native和web的。 首先我們總體上

Android繪製優化繪製效能分析

前言 一個優秀的應用不僅僅是要有吸引人的功能和互動,同時在效能上也有很高的要求。執行Android系統的手機,雖然配置在不斷的提升,但仍舊無法和PC相比,無法做到PC那樣擁有超大的記憶體以及高效能的CPU,因此在開發Android應用程式時也不可能無限制的使用

Android Handler 訊息機制分析

        Handler,Message,MessageQueue,Looper,是android一種訊息處理機制,在android開發中經常會用到,當Handler建立後,會被繫結到它所在的執行緒上,處理訊息的成員及其功能如下:        Handler:傳送一個

Android Hanlder機制分析 Hanlder常見用方法及原理

一、Handler介紹   在android開發的過程中,經常需要對UI進行更新操作。但是在子執行緒中對UI進行更新在android中是不允許的,這涉及到了執行緒安全問題,因此更新UI只能在主執行緒(UI執行緒)中進行。但是如果將耗時操作放在了UI執行緒中會帶

android Smali靜態分析

檔案頭 .class <訪問許可權> [修飾關鍵字] <類名> .super <父類名> .source <原始檔名> 示例 .class public Lcom/yiji/test/MainActi

android編譯系統分析source build/envsetup.sh與lunch

雖然已經有很多人分析過Android的編譯系統的程式碼了,我也看過他們的部落格,也學到了不少知識,但單純的看別人分析,終究還是理解的不深入,所以,我還是要自己再認真的分析一遍。 想想我們編譯android系統的過程: 首先:source build/envsetup

一個酷炫的button變化動畫開源庫原始碼分析Android morph Button

最近很是喜愛一些酷炫的動畫效果,特意在github上找了一些,看看他們是怎麼做到的,做個分析,順便可以對自定義控制元件和動畫有進一步的認識。 先來看下這個庫中button的變化效果是什麼樣的: 是不是很酷炫,而且中間的變化過程很舒服,沒

[日更-2019.5.24、25、26] Android系統中的Binder通訊機制分析--servicemanager

宣告 其實對於Android系統Binder通訊的機制早就有分析的想法,記得去年6、7月份Mr.Deng離職期間約定一起對其進行