Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android View系列一: View基礎知識

Android View系列一: View基礎知識

編輯:關於Android編程

1.什麼是View

View是Android中所有控件的基類,是一種界面層的控件的一種抽象,它代表了一個控件,除了View,還有ViewGroup(控件組),ViewGroup內部包含了許多控件,即一組View.ViewGroup繼承View.

2.View的位置參數

View的位置由四個頂點決定:top left right bottom
top:是左上角縱坐標.
left:是左上角橫坐標.
right:是右下角橫坐標.
bottom:是右下角縱坐標.
這些坐標都是相對於View的父容器來說的,因此它是一種相對坐標

得到View的寬度:

width=right-left

得到View的高度:

height=bottom-top

如何得到View的這四個參數呢?

Left=getLeft();
Right=getRight();
Top=getTop();
Bottom=getBottom();
此外,View還額外的四個參數:x ,y, translationX,translationY
x和y是View左上角的坐標.
translationX和translationY是View左上角相對於父容器的偏移量.
這四個參數也是相對於父容器的坐標,translationX和translationY的默認值是0,和View的四個基本的位置參數一樣,View也為它們提供了get/set方法.
幾個參數的換算關系:
x=left+translationX
y=top+translationY
View在平移的過程中,top和left表示的是原始左上角的位置信息,其值並不會發生改變,此時發生改變的是x,y,translationX和translationY這四個參數.

3.MotionEvent和TouchSlop

1.MotionEvent

在手指觸摸屏幕時會產生一系列事件,典型的事件有:
ACTION_DOWN–手指剛接觸屏幕
ACTION_MOVE–手指在屏幕上移動
ACTION_UP–手指從屏幕上松開的一瞬間
一次手指觸摸屏幕會產生一系列事件:
點擊屏幕後離開松開,事件序列為DOWN->UP;
點擊屏幕滑動一會再松開,事件序列為DOWN->MOVE->…>MOVE->UP.
通過MotionEvent對象我們可以得到點擊事件發生的x和y坐標.系統提供了兩組方法:getX/getY和getRawX/getRawY.

getX/getY和getRawX/getRawY區別:

getX/getY:返回的是相對於當前View左上角的x和y坐標,
getRawX/getRawY:返回的是相對於手機屏幕左上角的x和y坐標.

2.TouchSlop

TouchSlop是系統所能識別出的被認為是滑動的最小距離,當手指在屏幕上滑動時,如果兩次滑動之間的距離小於這個常量,那麼系統就不認為你是在進行滑動操作.
因為,滑動的距離太短,系統不認為它是滑動.
這是一個常量,設備不同值不同,可以通過如下方式獲取此常量:
ViewConfiguration.get(getContext()).getScaledTouchSlop().
可以在源碼中找到這個常量的定義:在frameworks/base/core/res/res/values/config.xml文件中,”config_viewConfigurationTouchSlop”對應這個常量定義:

8dp

4.VelocityTracker GestureDetector和Scroller

1.VelocityTracker

VelocityTracker速度追蹤,用於追蹤手指在滑動過程中的速度,包括水平和豎直方向的速度.
使用過程:
首先,在View的onTouchEvent方法中追蹤當前單擊事件的速度:

VelocityTracker velocityTracker=VelocityTracker.obtain();
velocityTracker.addMovement(event);

接著,當我們想知道當前的滑動速度時,這個時候可以采用如下方式來獲得當前的速度:

VelocityTracker.computeCurrentVelocity(1000);
int xVelocity=(int)velocityTracker.getXVelocity();
int yVelocity=(int)velocityTracker.getYVelocity();

注意三點:
第一點,獲取速度之前必須先計算速度,即getXVelocity和getYVelocity這兩個方法的前面必須要調用computeCurrentVelocity方法;
第二點:這裡的速度是指一段時間內手指所滑過的像素數,
第三點:速度可以為負數,當手指從右往左滑動時,水平方向速度即為負值.
速度的計算公式:
速度=(終點位置-起點位置)/時間段
通過公式和Android坐標系,可知道,手指逆著坐標系的正方向滑動,所產生的速度就為負值.
computeCurrentVelocity這個方法的參數表示的是一個時間單元或者說時間間隔,它的單位是毫秒(ms),計算速度時得到的速度就是在這個時間間隔內手指在水平或豎直方向上所滑動的像素數.
最後,當不需要使用它的時候,需要調用clear方法來重置並回收內存:

velocityTracker.clear();
velocityTracker.recycle();

2.GestureDetector

GestureDetector手勢檢測,用於輔助檢測用戶的單擊 滑動 長按 雙擊等行為.
使用過程:
首先,需要創建一個GestureDetector對象並實現OnGestureListener接口,和實現OnDoubleTapListener監聽雙擊行為:

GestureDetector mGestureDetector=new GestureDetector(this);
//解決長按屏幕後無法拖動的現象
mGestureDetector.setIsLongpressEnabled(false);

接著,接管目標View的onTouchEvent方法,在待監聽View的onTouchEvent方法中添加如下實現:

boolean consume=mGestureDetector.onTouchEvent(event);
return consume;

然後,有選擇地實現OnGestureListener和OnDoubleTapListener中的方法:onSingleTapUp(單擊),onFling(快速滑動),onScroll(拖動),onLongPress(長按)和onDoubleTap(雙擊).
如果只是監聽滑動相關的,在onTouchEvent中實現,如果要監聽雙擊這種行為的話,那麼就使用GestureDetector.

3.Scroller

Scroller彈性滑動對象,用於實現View的彈性滑動,Scroller來實現有過渡效果的滑動,其過程不是瞬時完成的,而是在一定的時間間隔內完成的.
使用方法:

Scroller scroller=new Scroller(mContext);
//緩慢滑動到指定位置
private void smoothScrollTo(int destX,int destY){
    int scrollX=getScrollX();
    int delta=destX-scrollX;
    //1000ms內滑向destX,效果就是慢慢滑動
    mScroller.startScroll(scrollX,0,delta,0,1000);
    invalidate();
}
@Override
public void computeScroll(){
    if(mScroller.computeScrollOffset()){
    scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
    postInvalidate();
    }
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved