Android中View跟隨手指滑動(dòng)效果的實(shí)例代碼
本文講述了Android中View跟隨手指滑動(dòng)效果的實(shí)例代碼。分享給大家供大家參考,具體如下:
1、android View 主要6種滑動(dòng)方法,分別是
- layout()
- offsetLeftAndRight()和offsetTopAndBottom()
- LayoutParams
- scrollBy()和 scrollTo()
- Scroller
- 動(dòng)畫
2、實(shí)現(xiàn)效果圖

3、自定義中使用layout()方法實(shí)習(xí)view的滑動(dòng)
public class MoveView extends View {
private int lastX, lastY;
public MoveView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MoveView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MoveView(Context context) {
super(context);
}
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;//計(jì)算滑動(dòng)的距離
int offsetY = y - lastY;
//重新放置新的位置
layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);
}
return true;
}
}
2、offsetLeftAndRight()和offsetTopAndBottom()
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;//計(jì)算滑動(dòng)的距離
int offsetY = y - lastY;
//重新放置新的位置
// layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);
offsetLeftAndRight(offsetX);
offsetTopAndBottom(offsetY);
}
return true;
}
3、LayoutParams 改變布局參數(shù)的方法:
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;//計(jì)算滑動(dòng)的距離
int offsetY = y - lastY;
//重新放置新的位置
// layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);
// offsetLeftAndRight(offsetX);
// offsetTopAndBottom(offsetY);
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
layoutParams.leftMargin = getLeft()+offsetX;
layoutParams.topMargin = getTop() +offsetY;
setLayoutParams(layoutParams);
}
return true;
}
4、當(dāng)然使用動(dòng)畫 ,scrollBy()和 scrollTo()也可以使view滑動(dòng),不足的是使用scrollBy()和 scrollTo()滑動(dòng)時(shí),是瞬間完成的,用戶體驗(yàn)不太好。
5、Scroller和 View的computeScroll() 結(jié)合使用,實(shí)現(xiàn)view平滑的移動(dòng)
public class MoveView extends View {
private Scroller mScroller;
public MoveView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mScroller = new Scroller(context);
}
public MoveView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MoveView(Context context) {
super(context);
}
//重寫computeScroll方法
@Override
public void computeScroll() { //view在onDraw的時(shí)候會(huì)調(diào)用此方法
super.computeScroll();
if (mScroller.computeScrollOffset()) {
((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
invalidate();
}
}
//在外部調(diào)用這個(gè)方法即可
public void smoothScrollTo(int destX, int destY) {
int scrollX = getScrollX();
int delta = destX - scrollX;
mScroller.startScroll(scrollX, 0, delta,0 ,6000);
invalidate();
}
}
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Android通過ImageView設(shè)置手指滑動(dòng)控件縮放
- Android視頻播放器屏幕左側(cè)邊隨手指上下滑動(dòng)亮度調(diào)節(jié)功能的原理實(shí)現(xiàn)
- Android中解決頁簽手指按下從左到右滑動(dòng)的bug
- 封裝的android監(jiān)聽手指左右滑動(dòng)屏幕的事件類分享
- android中使用Activity實(shí)現(xiàn)監(jiān)聽手指上下左右滑動(dòng)
- 詳解Android使用CoordinatorLayout+AppBarLayout+CollapsingToolbarLayou實(shí)現(xiàn)手指滑動(dòng)效果
相關(guān)文章
Android使用注解代替枚舉節(jié)省系統(tǒng)內(nèi)存開銷的方法
在本篇文章里小編給大家整理的是關(guān)于Android使用注解代替枚舉節(jié)省系統(tǒng)內(nèi)存開銷的方法和實(shí)例,需要的朋友們參考下。2020-01-01
Android音頻錄制MediaRecorder之簡易的錄音軟件實(shí)現(xiàn)代碼
這篇文章主要介紹了Android音頻錄制MediaRecorder之簡易的錄音軟件實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2014-01-01
解決Android studio模擬器啟動(dòng)失敗的問題
這篇文章主要介紹了Android studio模擬器啟動(dòng)失敗的問題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Flutter實(shí)現(xiàn)笑嘻嘻的動(dòng)態(tài)表情的示例代碼
這篇文章主要為大家介紹了如何利用Flutter實(shí)現(xiàn)笑嘻嘻的動(dòng)態(tài)表情,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Flutter有一定幫助,感興趣的可以了解一下2022-04-04
Android開發(fā)使用Drawable繪制圓角與圓形圖案功能示例
這篇文章主要介紹了Android開發(fā)使用Drawable繪制圓角與圓形圖案功能,結(jié)合具體實(shí)例形式分析了Drawable繪制圓角矩形的實(shí)現(xiàn)步驟與使用方法,需要的朋友可以參考下2017-10-10
Flutter Android端啟動(dòng)白屏問題的解決
Flutter 應(yīng)用在 Android 端上啟動(dòng)時(shí)會(huì)有一段很明顯的白屏現(xiàn)象,白屏的時(shí)長由設(shè)備的性能決定,設(shè)備性能越差,白屏?xí)r間越長。這篇文章主要介紹了Flutter Android端啟動(dòng)白屏問題的解決。感興趣的小伙伴們可以參考一下2018-07-07

