Android 自定義彈性ListView控件實例代碼(三種方法)
關于在Android中實現(xiàn)ListView的彈性效果,有很多不同的方法,網(wǎng)上一搜,也有很多,下面貼出在項目中經(jīng)常用到的兩種實現(xiàn)ListView彈性效果的方法(基本上拿來就可以用),供大家參考:
彈性ListView
第一種方法:
import android.content.Context; import android.content.res.Configuration; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.View; import android.view.ViewConfiguration; import android.widget.ListView; import java.lang.reflect.Field; import java.lang.reflect.Modifier; /** * Created by Noah on 2016/1/16. */ public class BounceListView extends ListView { private static final float MAX_Y_OVERSCROLL_DISTANCE = 200; private float mMaxYOverscrollDistance; public BounceListView(Context context) { this(context, null); } public BounceListView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public BounceListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initBounceListView(); } private void initBounceListView(){ final DisplayMetrics metrics = getContext().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) { return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, (int)mMaxYOverscrollDistance, isTouchEvent); } /** * 設置本App所有的ListView彈性粒度 * @param ctx * @param size * @return */ public boolean configGlobalMaxOverScrollDistance(Context ctx,int size) { try { final DisplayMetrics metrics = ctx.getResources().getDisplayMetrics(); final float density = metrics.density; int value = (int) (density * size); mMaxYOverscrollDistance = value; ViewConfiguration config = ViewConfiguration.get(ctx); Field mOverscrollDistance = ViewConfiguration.class.getDeclaredField("mOverscrollDistance"); if(!mOverscrollDistance.isAccessible() || !Modifier.isPublic(mOverscrollDistance.getModifiers())) { mOverscrollDistance.setAccessible(true); } mOverscrollDistance.setInt(config,value); } catch (Exception e) { e.printStackTrace(); return false; } return true; } }
第二種比較簡單,好容易理解,只是動態(tài)改變了ListView在Y軸上的可移動距離,代碼如下:
import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.widget.ListView; /** * 彈性ListView。 * @author E */ public class FlexiListView extends ListView{ //初始可拉動Y軸方向距離 private static final int MAX_Y_OVERSCROLL_DISTANCE = 100; //上下文環(huán)境 private Context mContext; //實際可上下拉動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) { //實現(xiàn)的本質就是在這里動態(tài)改變了maxOverScrollY的值 return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent); } }
第三種方法,結合了手勢來實現(xiàn)ListView的彈性效果,這里可以根據(jù)手勢來進行更多的擴展,代碼如下:
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。主要是實現(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和ProgressBar(進度條控件)的使用方法
- Android控件之ListView用法實例詳解
- Android ExpandableListView展開列表控件使用實例
- Android控件ListView用法(讀取聯(lián)系人示例代碼)
- Android UI控件ExpandableListView基本用法詳解
- 淺談Android開發(fā)中ListView控件性能的一些優(yōu)化方法
- android使用ExpandableListView控件實現(xiàn)小說目錄效果的例子
- Android控件之使用ListView實現(xiàn)時間軸效果
- Android編程之控件ListView使用方法
- Android控件ListView使用方法詳解
相關文章
android 點擊EditText始終不彈出軟件鍵盤實現(xiàn)代碼
這篇文章主要介紹了android 點擊EditText始終不彈出軟件鍵盤實現(xiàn)代碼的相關資料,需要的朋友可以參考下2016-11-11Android入門之系統(tǒng)設置Configuration類的使用教程
這篇文章主要給大家介紹一下Configuration類的使用,Configuration類是用來描述手機設備的配置信息的,比如屏幕方向,?觸摸屏的觸摸方式等,感興趣的可以了解一下2022-12-12Android程序開發(fā)之使用Design包實現(xiàn)QQ動畫側滑效果和滑動菜單導航
這篇文章主要介紹了Android程序開發(fā)之使用Design包實現(xiàn)QQ動畫側滑效果和滑動菜單導航的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07Android AlertDialog多種創(chuàng)建方式案例詳解
這篇文章主要介紹了Android AlertDialog多種創(chuàng)建方式案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08Android 使用ViewPager實現(xiàn)圖片左右循環(huán)滑動自動播放
這篇文章主要介紹了Android 使用ViewPager實現(xiàn)圖片左右循環(huán)滑動自動播放的相關資料,非常不錯,具有參考解決價值,需要的朋友可以參考下2016-08-08