1. 程式人生 > >Android 實現ListView的彈性效果

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)