Android 實(shí)現(xiàn)滑動(dòng)的六種方式
1、效果視頻

2、剖析Android坐標(biāo)系
滑動(dòng)的本質(zhì)是移動(dòng),滑動(dòng)的原理就是通過不斷的改變View的坐標(biāo)而實(shí)現(xiàn)。

Android系統(tǒng)提供了很多方法獲取坐標(biāo)值,可以將其分為兩種類別,具體如下:
View 提供的獲取坐標(biāo)的方法:
getTop():獲取到的是View自身的頂邊到其父布局頂邊的距離getLeft():獲取到的是View自身的左邊到其父布局左邊的距離getRight():獲取到的是View自身的右邊到其父布局左邊的距離getBottom():獲取到的是View自身的底邊到其父布局頂邊的距離
MotionEvent 提供的方法:
getX():獲取點(diǎn)擊事件距離控件左邊的距離,即視圖坐標(biāo)getY():獲取點(diǎn)擊事件距離控件頂邊的距離,即視圖坐標(biāo)getRawX():獲取點(diǎn)擊事件距離整個(gè)屏幕左邊的距離,即絕對(duì)坐標(biāo)getRawY():獲取點(diǎn)擊事件距離整個(gè)屏幕頂邊的距離,即絕對(duì)坐標(biāo)
3、實(shí)現(xiàn)方式
3.1 layout
使用絕對(duì)坐標(biāo)系,每次執(zhí)行移動(dòng)邏輯后需要重新設(shè)置初始化坐標(biāo)
@Override
public boolean onTouchEvent(MotionEvent event) {
int rawX = (int) (event.getRawX());
int rawY = (int) (event.getRawY());
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
lastX = rawX;
lastY = rawY;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = rawX - lastX;
int offsetY = rawY - lastY;
layout( getLeft()+offsetX,getTop()+offsetY,getRight()+offsetX,getBottom()+offsetY );
lastX = rawX;
lastY = rawY;
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
3.2 scrollBy
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = x - lastX;
int offsetY = y - lastY;
((View) getParent()).scrollBy( -offsetX, -offsetY );
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
3.3 offsetLeftAndRight offsetTopAndButton
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = x - lastX;
int offsetY = y - lastY;
offsetLeftAndRight( offsetX );
offsetTopAndBottom( offsetY );
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
3.4 LayoutParams
通過getLayoutParams()獲取LayoutParams時(shí),需要根據(jù)不同的父類型使用設(shè)置不同的類型,比如父布局為LinearLayout則設(shè)置類型為 LinearLayout.LayoutParams
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = x - lastX;
int offsetY = y - lastY;
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)getLayoutParams();
layoutParams.leftMargin = getLeft()+offsetX;
layoutParams.topMargin = getTop()+offsetY;
setLayoutParams( layoutParams );
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
更方便的是直接使用ViewGroup,不需要判斷父布局類型
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams)getLayoutParams();
layoutParams.leftMargin = getLeft()+offsetX;
layoutParams.topMargin = getTop()+offsetY;
setLayoutParams( layoutParams );
3.5 Scroller
初始化Scroller:
scroller = new Scroller( context );
重寫computeScroll()方法
使用computeScrollOffset()判定是否完成了整個(gè)滑動(dòng):
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
((View) getParent()).scrollTo( scroller.getCurrX(), scroller.getCurrY() );
invalidate();
}
super.computeScroll();
}
@Override
public boolean onTouchEvent(MotionEvent mv) {
View parent = (View) getParent();
switch (mv.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) mv.getX();
lastY = (int) mv.getY();
break;
case MotionEvent.ACTION_MOVE:
int upX = (int) (mv.getX() - lastX);
int upY = (int) (mv.getY() - lastY);
parent.scrollBy( -upX, -upY );
break;
case MotionEvent.ACTION_UP:
scroller.startScroll( parent.getScrollX(), parent.getScrollY(), -parent.getScrollX(), -parent.getScrollY(), 1000 );
invalidate();
break;
}
return super.onTouchEvent( mv );
}
3.6 平移動(dòng)畫
效果視頻:

private void InitAnimation(){
animation = new TranslateAnimation( 0,200,0,200 );
animation.setDuration( 1000 );
}
moveButton.startAnimation( animation );
到此這篇關(guān)于Android 實(shí)現(xiàn)滑動(dòng)的六種方式的文章就介紹到這了,更多相關(guān)Android 實(shí)現(xiàn)滑動(dòng)的方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android 滑動(dòng)小圓點(diǎn)ViewPager的兩種設(shè)置方法詳解流程
- Android深入探究自定義View之嵌套滑動(dòng)的實(shí)現(xiàn)
- Android實(shí)現(xiàn)背景顏色滑動(dòng)漸變效果的全過程
- Android直播軟件搭建之實(shí)現(xiàn)背景顏色滑動(dòng)漸變效果的詳細(xì)代碼
- Android HorizontalScrollView滑動(dòng)與ViewPager切換案例詳解
- Android滑動(dòng)拼圖驗(yàn)證碼控件使用方法詳解
- Android之FanLayout制作圓弧滑動(dòng)效果
- Android之ArcSlidingHelper制作圓弧滑動(dòng)效果
- Android 滑動(dòng)Scrollview標(biāo)題欄漸變效果(仿京東toolbar)
相關(guān)文章
Android?Studio實(shí)現(xiàn)彈窗設(shè)置
這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)彈窗設(shè)置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Android提高之Android手機(jī)與BLE終端通信
這篇文章主要介紹了Android手機(jī)與BLE終端通信的方法,有很大的實(shí)用價(jià)值,需要的朋友可以參考下2014-08-08
android實(shí)現(xiàn)定時(shí)拍照并發(fā)送微博功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)定時(shí)拍照并發(fā)送微博功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
基于Android AppWidgetProvider的使用介紹
本篇文章小編為大家介紹,基于Android AppWidgetProvider的使用。需要的朋友參考下2013-04-04
Android自定義ViewGroup實(shí)現(xiàn)淘寶商品詳情頁
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewGroup實(shí)現(xiàn)淘寶商品詳情頁,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
Android實(shí)現(xiàn)自動(dòng)匹配關(guān)鍵字并且標(biāo)紅功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自動(dòng)匹配關(guān)鍵字并且標(biāo)紅功能,單關(guān)鍵字和多關(guān)鍵字進(jìn)行匹配,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
android中使用SharedPreferences進(jìn)行數(shù)據(jù)存儲(chǔ)的操作方法
本篇文章介紹了,在android中使用SharedPreferences進(jìn)行數(shù)據(jù)存儲(chǔ)的操作方法。需要的朋友參考下2013-04-04
詳解Android應(yīng)用中屏幕尺寸的獲取及dp和px值的轉(zhuǎn)換
這篇文章主要介紹了Android應(yīng)用中屏幕尺寸的獲取及dp和px值的轉(zhuǎn)換方法,這里主要介紹將dp轉(zhuǎn)化為px值的例子,需要的朋友可以參考下2016-03-03

