国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android ListView彈性效果的實現方法

2019-12-12 06:18:08
字體:
來源:轉載
供稿:網友

關于在Android中實現ListView的彈性效果,有很多不同的方法,網上一搜,也有很多,下面貼出在項目中經常用到的兩種實現ListView彈性效果的方法(基本上拿來就可以用),供大家參考:

第一種比較簡單,好容易理解,只是動態改變了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;   //上下文環境   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) {      //實現的本質就是在這里動態改變了maxOverScrollY的值     return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent);    }    } 

第二種方法,結合了手勢來實現ListView的彈性效果,這里可以根據手勢來進行更多的擴展,代碼如下:

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。主要是實現父類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彈性效果的實現方法,整理出來,希望對大家有所幫助!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台江县| 贵港市| 萨迦县| 英吉沙县| 嘉兴市| 黄浦区| 新余市| 锡林郭勒盟| 定西市| 富锦市| 津市市| 宽甸| 叶城县| 依兰县| 黎城县| 河曲县| 岢岚县| 霍州市| 德令哈市| 廊坊市| 天门市| 平陆县| 宜宾市| 滦平县| 眉山市| 米林县| 子长县| 遂平县| 皮山县| 福鼎市| 道真| 无极县| 海兴县| 广宗县| 商都县| 阿鲁科尔沁旗| 渑池县| 北辰区| 留坝县| 敖汉旗| 平江县|