編輯:關於Android編程
View是Android中所有控件的基類,是一種界面層的控件的一種抽象,它代表了一個控件,除了View,還有ViewGroup(控件組),ViewGroup內部包含了許多控件,即一組View.ViewGroup繼承View.
View的位置由四個頂點決定:top left right bottom
top:是左上角縱坐標.
left:是左上角橫坐標.
right:是右下角橫坐標.
bottom:是右下角縱坐標.
這些坐標都是相對於View的父容器來說的,因此它是一種相對坐標
width=right-left
height=bottom-top
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這四個參數.
在手指觸摸屏幕時會產生一系列事件,典型的事件有:
ACTION_DOWN–手指剛接觸屏幕
ACTION_MOVE–手指在屏幕上移動
ACTION_UP–手指從屏幕上松開的一瞬間
一次手指觸摸屏幕會產生一系列事件:
點擊屏幕後離開松開,事件序列為DOWN->UP;
點擊屏幕滑動一會再松開,事件序列為DOWN->MOVE->…>MOVE->UP.
通過MotionEvent對象我們可以得到點擊事件發生的x和y坐標.系統提供了兩組方法:getX/getY和getRawX/getRawY.
getX/getY:返回的是相對於當前View左上角的x和y坐標,
getRawX/getRawY:返回的是相對於手機屏幕左上角的x和y坐標.
TouchSlop是系統所能識別出的被認為是滑動的最小距離,當手指在屏幕上滑動時,如果兩次滑動之間的距離小於這個常量,那麼系統就不認為你是在進行滑動操作.
因為,滑動的距離太短,系統不認為它是滑動.
這是一個常量,設備不同值不同,可以通過如下方式獲取此常量:
ViewConfiguration.get(getContext()).getScaledTouchSlop().
可以在源碼中找到這個常量的定義:在frameworks/base/core/res/res/values/config.xml文件中,”config_viewConfigurationTouchSlop”對應這個常量定義:
8dp
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();
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.
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();
}
}
我這裡只是簡單的用了兩個listview來實現的,先上效果圖。比較粗糙。預留了自定義的空間。思路:從上圖應該可以看的出來。就是上下兩個listview。點擊下面的ltem
相信大家在android開發的過程中總會遇到要在Activity中間傳遞數據的情況,當然,遇到需要在Intent中傳遞對象的情況也不可避免,所以我就so了一下相關的知識,
介紹彈性滑動也就是漸進式滑動,實現彈性滑動的方法有很多,但是他們都有一個共同的思想:將一次大的滑動分成若干次小的滑動並在一段時間內完成。本文主要介紹三種彈性滑動方式,Sc
先來看下效果圖: 其中show和dismiss的時候有動畫效果。 原先試過使用PopupWindow來做,但是使用的時候不是那麼舒服,畢竟不