Android 實現ListView的彈性效果
關於在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的彈性效果
關於在Android中實現ListView的彈性效果,有很多不同的方法,網上一搜,也有很多,下面貼出在專案中經常用到的兩種實現ListView彈性效果的方法(基本上拿來就可以用),供大家參考: 第一種比較簡單,好容易理解,只是動態改變了ListView在
Android 實現ListView不可滾動效果
希望得到的效果是ListView不能滾動,但是最大的問題在與ListView Item還必有點選事件,如果不需要點選事件那就簡單了,直接設定ListView.setEnable(false); 如果還需要點選事件,滾動與點選都是在ListView Touc
Android RecyclerView (一)初學,實現ListView列表效果。
大家好。今天我記錄一下我學習RecyclerView的過程, RecyclerView,是v7包裡的一個UI控制元件,在官網上的描述,它是一款比起ListView更加靈活的列表顯示控制元件。昨天呢,我也初步的去學習了一下它的使用,今天寫一下它最基本的使用.
Android實現ListView阻尼式(下拉回彈)效果
最近想模仿小米MIUI V5簡訊裡面的一個功能——私密簡訊,它的入口在簡訊列表,列表往下拉到1/3左右,我用Eclipse上的工具截了圖,包括該結構的佈局,如下圖: 從它的UI結構可以看出,用的是層疊結構,即將ListView和一個普通View(取名叫privateEn
IOS開發學習筆記十四 UITableView控制元件實現ListView的效果
效果圖:專案地址 ViewController對應的程式碼: #import "ViewController.h" #import "CZHero.h" @interface ViewController () <UITableViewDataSource, UIT
Android 實現ListView的A-Z字母排序和過濾搜尋功能,實現漢字轉成拼音
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Android 實現跑馬燈效果
這裡用到了HorizontalScrollView巢狀TextView,上xml佈局: <HorizontalScrollView android:id="@+id/horiSv" android:layout_width="match_parent"
android 實現Listview 動態刪除
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list); listView.setAdapter(adapter); listVie
android實現文字漸變效果和歌詞進度的效果
要用TextView使用漸變色,那我們就必須要了解LinearGradient(線性漸變)的用法。 LinearGradient的引數解釋 LinearGradient也稱作線性渲染,LinearGradient的作用是實現某一區域內顏色的線性漸變效果,
Android實現輪播效果SliderLayout
實現輪播效果有2種方法: (1)使用ViewPager+ImageView,通過Handler進行間隔傳送訊息,實現自動輪播效果 xml程式碼: <android.support.v4.view.ViewPager android:i
快速整合android實現listview的字母A-Z排序,介面側邊字母索引
public abstract class MyExpandAdapter implements ExpandableListAdapter{ //用抽象方法把下拉子選單的不用的方法集中在這裡,方便觀看 //抽象出介面,回撥方法,用方法繼承就可以定義子選單 @Override
Android 實現水波紋效果
一、首先還是先上效果 二、實現原理 自定義view,使用Path和貝塞爾曲線繪製,然後不斷重新整理,並且改變X、Y的值 主要知識點rQuadTo的使用 三、實現 WaveView.java public class WaveView extends V
Android實現ListView顯示資訊,點選每個item,跳轉到相應介面
介面如下:(做這個目的僅僅是為了學習一點小知識,因為自己才剛開始) 實現的方法比較簡單,就是定義一個ListView,然後設定監聽,ListView對每個條目的監聽是setOnItemClickListener。 onItemClick(AdapterView&
安卓實現listview聯動效果且選項多選
實現效果如圖,點選大洲進行第一個listview資料的重新整理且聯動第二個listview資料更新,正常第二個listview是單選,點選後進行資料重新整理,現在做的是資料多選最後點選確定按鈕進行資料提交 首先實現兩個listview聯動效果: 資料來源如下 "
android實現tab切換效果
一:利用ViewPager實現Tab切換效果 1.首先新建幾個要切換的xml佈局檔案,然後在主佈局中間新增<android.support.v4.view.ViewPager>佈局,用於顯示我們寫好的xml佈局。 2.在主方法中,定新增程式碼如下:LayoutI
Android 實現ListView item的左滑(右滑)監聽事件 swipemenulistview
這篇文章將會介紹我是如何學習item的左滑監聽事件設定的,首先我們先新增依賴: compile ‘com.baoyz.swipemenulistview:library:1.3.+’ 可以看到,我們是藉助大神所寫的swipemenulistView這個空
android 實現水波紋效果(二) 優化篇
在我的上一篇文章中,初步介紹了一下水波紋的實現,確實也實現了,剛開始我表示很滿意啊,但是後來看了一下系統的實現效果,我開始發現有點不對勁;來對比一下: 這是優化前的效果 這是優化後的效果 區別看不出來?仔細看一下,系統的實現效果是
Android實現TextView走馬燈效果同時自動更新顯示當前時間
在專案開發中,有時候我們需要顯示一個走馬燈效果,簡單的走馬燈效果當然容易實現; 在xml檔案中給TextView設定以下屬性即可; android:focusable=true; android:focuseableInTouchMode=true android:sin
Android實現拖動效果的兩種解法
因為最近專案的需要,需要實現一個拖動效果,看了一下網上剛好有這種拖動效果的demo,程式碼大概如下: private void initListener(){ screenWidth = getScreenWidth(this);//獲取
安卓中自定義LinerLayout實現listview的效果
public class LinearLayoutForNet extends LinearLayout { private NetBasePaiAdapter adapter; public LinearLayoutForNet(Context context)