1. 程式人生 > >Android Scroll分析(一)滑動效果產生分析

Android Scroll分析(一)滑動效果產生分析

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

在瞭解如何實現滑動效果之前,需要先來了解一下Android中視窗座標體系和螢幕的觸控事件——MotionEvent。

Android座標系

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

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

檢視座標系

檢視座標系描述了子檢視在父檢視中的位置關係。與Android座標系類似,檢視座標系同樣是以原點向右為X軸正方向,以原點向下為Y軸正方向,只不過在檢視座標系中,原點不再是Android座標系中的螢幕最左上角,而是以父檢視左上角為座標原點,如下圖所示:

這裡寫圖片描述

觸控事件——MotionEvent

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
;

通常情況下,我們會在onTouchEvent(MotionEvent 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_DOWN:
                //處理輸入的按下事件
                break;
            case MotionEvent.ACTION_MOVE:
                //處理輸入的移動事件
                break;
            case MotionEvent.ACTION_UP:
                //處理輸入的離開事件
                break;
        }
        return true;
    }

在Android中,系統提供了非常多的方法來獲取座標值、相對距離等。下面總結了一些API,結合Android座標系來看看該如何使用它們。

這些方法分成如下兩個類別:

  • View提供的獲取座標方法
    getTop():獲取到的是View自身的頂邊到其父佈局頂邊的距離
    getLeft():獲取到的是View自身的左邊到其父佈局左邊的距離
    getRight():獲取到的是View自身的右邊到其父佈局左邊的距離
    getBottom():獲取到的是View自身的底邊到其父佈局頂邊的距離

  • MotionEvent提供的獲取座標方法
    getX():獲取點選事件距離控制元件左邊的距離,即檢視座標
    getY():獲取點選事件距離控制元件頂邊的距離,即檢視座標
    getRawX():獲取點選事件距離整個螢幕左邊的距離,即絕對座標
    getRawX():獲取點選事件距離整個螢幕頂邊的距離,即絕對座標

相關推薦

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

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

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

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

資料分析豆瓣華語電影分析

本文首發於『運籌OR帷幄』公眾號,大家也可前往公眾號檢視,《用資料帶你瞭解電影行業—華語篇》。 在之前,我們已經用通過爬蟲獲取了豆瓣華語電影共33133部電影的資料,具體爬蟲介紹請見之前的博文,爬蟲實戰(一)——利用scrapy爬取豆瓣華語電影。本文對爬蟲過程進行簡要概述後,對這部分資料

RxJava2原始碼分析:基本流程分析

前言:到現在這個階段,網上關於RxJava2原始碼分析的文章已經滿天飛了,我寫這篇文章的目的並不是說我會分析的比他們好,比他們透徹,這篇文章的目的只是單純的記錄自己分析RxJava2原始碼的成功及收穫。 概述   對於一個程式設計人的技術成長,一般會經歷三個階段,首先是學會使用開源庫,然後是知道

用實戰玩轉pandas資料分析——使用者消費行為分析python

  CD商品訂單資料的分析總結。根據訂單資料(使用者的消費記錄),從時間維度和使用者維度,分析該網站使用者的消費行為。通過此案例,總結訂單資料的一些共性,能通過使用者的消費記錄挖掘出對業務有用的資訊。對其他產品的線上消費資料分析有一定的借鑑價值,能達到舉一反三的效果。 訂單交易資料分析 [

Android Scroll分析

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

Android學習筆記之仿正點鬧鐘時間齒輪滑動效果

看到正點鬧鐘上的設定時間的滑動效果非常好看,自己就想做一個那樣的,在網上就開始搜資料了,看到網上有的齒輪效果的程式碼非常多,也非常難懂,我就決定自己研究一下,現在我就把我的研究成果分享給大家。我研究的這個效果出來了,而且程式碼也非常簡單,通俗易懂。效果圖如下: 首先是Ma

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多媒體分析MediaScanner

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

自編譯安卓系統分析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實現錄屏直播ScreenRecorder的簡單分析

應專案需求瞄準了Bilibili的錄屏直播功能,基本就仿著做一個吧。研究後發現Bilibili是使用的MediaProjection 與 VirtualDisplay結合實現的,需要 Android 5.0 Lollipop API 21以上的系統才

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:傳送一個