Android ListView彈性效果的實(shí)現(xiàn)方法
關(guān)于在Android中實(shí)現(xiàn)ListView的彈性效果,有很多不同的方法,網(wǎng)上一搜,也有很多,下面貼出在項(xiàng)目中經(jīng)常用到的兩種實(shí)現(xiàn)ListView彈性效果的方法(基本上拿來就可以用),供大家參考:
第一種比較簡(jiǎn)單,好容易理解,只是動(dòng)態(tài)改變了ListView在Y軸上的可移動(dòng)距離,代碼如下:
import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.widget.ListView; /** * 彈性ListView。 * @author E */ public class FlexiListView extends ListView{ //初始可拉動(dòng)Y軸方向距離 private static final int MAX_Y_OVERSCROLL_DISTANCE = 100; //上下文環(huán)境 private Context mContext; //實(shí)際可上下拉動(dòng)Y軸上的距離 private int mMaxYOverscrollDistance; public FlexiListView(Context context){ super(context); mContext = context; initBounceListView(); } public FlexiListView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; initBounceListView(); } public FlexiListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; initBounceListView(); } private void initBounceListView(){ final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); final float density = metrics.density; mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE); } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { //實(shí)現(xiàn)的本質(zhì)就是在這里動(dòng)態(tài)改變了maxOverScrollY的值 return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent); } }
第二種方法,結(jié)合了手勢(shì)來實(shí)現(xiàn)ListView的彈性效果,這里可以根據(jù)手勢(shì)來進(jìn)行更多的擴(kuò)展,代碼如下:
import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; import android.view.View; import android.view.animation.TranslateAnimation; import android.widget.ListView; /** * 具有彈性效果的ListView。主要是實(shí)現(xiàn)父類dispatchTouchEvent方法和OnGestureListener中onScroll方法。 * @author E */ public class FlexibleListView extends ListView implements OnGestureListener{ private Context context = null; private boolean outBound = false; private int distance; private int firstOut; public FlexibleListView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } public FlexibleListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; } public FlexibleListView(Context context) { super(context); this.context = context; } GestureDetector lisGestureDetector = new GestureDetector(context, this); @Override public boolean dispatchTouchEvent(MotionEvent event) { int act = event.getAction(); if ((act == MotionEvent.ACTION_UP || act == MotionEvent.ACTION_CANCEL) && outBound) { outBound = false; // scroll back } if (!lisGestureDetector.onTouchEvent(event)) { outBound = false; } else { outBound = true; } Rect rect = new Rect(); getLocalVisibleRect(rect); TranslateAnimation am = new TranslateAnimation( 0, 0, -rect.top, 0); am.setDuration(300); startAnimation(am); scrollTo(0, 0); return super.dispatchTouchEvent(event); } @Override public boolean onDown(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { int firstPos = getFirstVisiblePosition(); int lastPos = getLastVisiblePosition(); int itemCount = getCount(); // outbound Top if (outBound && firstPos != 0 && lastPos != (itemCount - 1)) { scrollTo(0, 0); return false; } View firstView = getChildAt(firstPos); if (!outBound) firstOut = (int) e2.getRawY(); if (firstView != null&& (outBound || (firstPos == 0 && firstView.getTop() == 0 && distanceY < 0))) { // Record the length of each slide distance = firstOut - (int) e2.getRawY(); scrollTo(0, distance / 2); return true; } // outbound Bottom return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } }
以上兩種常用Android ListView彈性效果的實(shí)現(xiàn)方法,整理出來,希望對(duì)大家有所幫助!
相關(guān)文章
Android自定義控件實(shí)現(xiàn)下拉刷新效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)下拉刷新效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08一文教你如何使用Databinding寫一個(gè)關(guān)注功能
這篇文章主要介紹了一文教你如何使用Databinding寫一個(gè)關(guān)注功能,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Android實(shí)現(xiàn)歌曲播放時(shí)歌詞同步顯示具體思路
歌曲播放時(shí)歌詞同步顯示,我們需要讀取以上歌詞文件的每一行轉(zhuǎn)換成成一個(gè)個(gè)歌詞實(shí)體,可根據(jù)當(dāng)前播放器的播放進(jìn)度與每句歌詞的開始時(shí)間,得到當(dāng)前屏幕中央高亮顯示的那句歌詞2013-06-06關(guān)于Android HTML5 audio autoplay無效問題的解決方案
這篇文章主要介紹了關(guān)于Android HTML5 audio autoplay無效問題的解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09android實(shí)現(xiàn)可自由移動(dòng)、監(jiān)聽點(diǎn)擊事件的懸浮窗
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)可自由移動(dòng)、監(jiān)聽點(diǎn)擊事件的懸浮窗,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Android便攜式熱點(diǎn)的開啟狀態(tài)檢測(cè)和SSID的獲取方法
WIFI熱點(diǎn)的開啟狀態(tài)和開啟后的SSID如何獲取呢?接下來通過本文給大家分享Android便攜式熱點(diǎn)的開啟狀態(tài)檢測(cè)和SSID的獲取方法,需要的朋友參考下吧2017-01-01Android編程實(shí)現(xiàn)基于BitMap獲得圖片像素?cái)?shù)據(jù)的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)基于BitMap獲得圖片像素?cái)?shù)據(jù)的方法,對(duì)比分析了兩種獲取圖片像素的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11