Android 自定義彈性ListView控件實(shí)例代碼(三種方法)
關(guān)于在Android中實(shí)現(xiàn)ListView的彈性效果,有很多不同的方法,網(wǎng)上一搜,也有很多,下面貼出在項(xiàng)目中經(jīng)常用到的兩種實(shí)現(xiàn)ListView彈性效果的方法(基本上拿來(lái)就可以用),供大家參考:
彈性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);
}
/**
* 設(shè)置本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;
}
}
第二種比較簡(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ì)來(lái)實(shí)現(xiàn)ListView的彈性效果,這里可以根據(jù)手勢(shì)來(lái)進(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)父類(lèi)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;
}
}
以上給大家分享了幾種比較常用的方法,腳本之家小編整理出來(lái)的,希望對(duì)大家有所幫助。
- android ListView和ProgressBar(進(jìn)度條控件)的使用方法
- Android控件之ListView用法實(shí)例詳解
- Android ExpandableListView展開(kāi)列表控件使用實(shí)例
- Android控件ListView用法(讀取聯(lián)系人示例代碼)
- Android UI控件ExpandableListView基本用法詳解
- 淺談Android開(kāi)發(fā)中ListView控件性能的一些優(yōu)化方法
- android使用ExpandableListView控件實(shí)現(xiàn)小說(shuō)目錄效果的例子
- Android控件之使用ListView實(shí)現(xiàn)時(shí)間軸效果
- Android編程之控件ListView使用方法
- Android控件ListView使用方法詳解
相關(guān)文章
android 點(diǎn)擊EditText始終不彈出軟件鍵盤(pán)實(shí)現(xiàn)代碼
這篇文章主要介紹了android 點(diǎn)擊EditText始終不彈出軟件鍵盤(pán)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11
Android入門(mén)之系統(tǒng)設(shè)置Configuration類(lèi)的使用教程
這篇文章主要給大家介紹一下Configuration類(lèi)的使用,Configuration類(lèi)是用來(lái)描述手機(jī)設(shè)備的配置信息的,比如屏幕方向,?觸摸屏的觸摸方式等,感興趣的可以了解一下2022-12-12
Android實(shí)現(xiàn)掃一掃識(shí)別數(shù)字功能
這篇文章主要介紹了Android實(shí)現(xiàn)掃一掃識(shí)別數(shù)字功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-09-09
Android程序開(kāi)發(fā)之使用Design包實(shí)現(xiàn)QQ動(dòng)畫(huà)側(cè)滑效果和滑動(dòng)菜單導(dǎo)航
這篇文章主要介紹了Android程序開(kāi)發(fā)之使用Design包實(shí)現(xiàn)QQ動(dòng)畫(huà)側(cè)滑效果和滑動(dòng)菜單導(dǎo)航的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
Android AlertDialog多種創(chuàng)建方式案例詳解
這篇文章主要介紹了Android AlertDialog多種創(chuàng)建方式案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Android 使用ViewPager實(shí)現(xiàn)圖片左右循環(huán)滑動(dòng)自動(dòng)播放
這篇文章主要介紹了Android 使用ViewPager實(shí)現(xiàn)圖片左右循環(huán)滑動(dòng)自動(dòng)播放的相關(guān)資料,非常不錯(cuò),具有參考解決價(jià)值,需要的朋友可以參考下2016-08-08
Android組件WebView編寫(xiě)有道詞典小案例分享
這篇文章主要為大家分享了Android組件WebView編寫(xiě)有道詞典小案例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05

