Android編程ViewPager回彈效果實(shí)例分析
本文實(shí)例講述了Android編程ViewPager回彈效果。分享給大家供大家參考,具體如下:
其實(shí)在我們很多應(yīng)用中都看到當(dāng)ViewPager滑到第一頁(yè)或者最后一頁(yè)的時(shí)候,如果再滑動(dòng)的時(shí)候,就會(huì)有一個(gè)緩沖的過(guò)程,也就是回彈效果。之前在研究回彈效果的時(shí)候,也順便實(shí)現(xiàn)了ViewPager的回彈效果,其實(shí)也很簡(jiǎn)單,一下是實(shí)現(xiàn)代碼,注釋比較少:
package com.freesonfish.viewpager_2;
import android.content.Context;
import android.graphics.Rect;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.animation.TranslateAnimation;
public class MyViewPager extends ViewPager {
private Rect mRect = new Rect();//用來(lái)記錄初始位置
private int pagerCount = 3;
private int currentItem = 0;
private boolean handleDefault = true;
private float preX = 0f;
private static final float RATIO = 0.5f;//摩擦系數(shù)
private static final float SCROLL_WIDTH = 30f;
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
//設(shè)置總共有多少頁(yè),請(qǐng)記得調(diào)用它
public void setpagerCount(int pagerCount) {
this.pagerCount = pagerCount;
}
//這是當(dāng)前是第幾頁(yè),請(qǐng)?jiān)趏nPageSelect方法中調(diào)用它。
public void setCurrentIndex(int currentItem) {
this.currentItem = currentItem;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return super.dispatchKeyEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if (arg0.getAction() == MotionEvent.ACTION_DOWN) {
preX = arg0.getX();//記錄起點(diǎn)
}
return super.onInterceptTouchEvent(arg0);
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
switch (arg0.getAction()) {
case MotionEvent.ACTION_UP:
onTouchActionUp();
break;
case MotionEvent.ACTION_MOVE:
//當(dāng)時(shí)滑到第一項(xiàng)或者是最后一項(xiàng)的時(shí)候。
if ((currentItem == 0 || currentItem == pagerCount - 1)) {
float nowX = arg0.getX();
float offset = nowX - preX;
preX = nowX;
if (currentItem == 0) {
if (offset > SCROLL_WIDTH) {//手指滑動(dòng)的距離大于設(shè)定值
whetherConditionIsRight(offset);
} else if (!handleDefault) {//這種情況是已經(jīng)出現(xiàn)緩沖區(qū)域了,手指慢慢恢復(fù)的情況
if (getLeft() + (int) (offset * RATIO) >= mRect.left) {
layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
}
}
} else {
if (offset < -SCROLL_WIDTH) {
whetherConditionIsRight(offset);
} else if (!handleDefault) {
if (getRight() + (int) (offset * RATIO) <= mRect.right) {
layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
}
}
}
} else {
handleDefault = true;
}
if (!handleDefault) {
return true;
}
break;
default:
break;
}
return super.onTouchEvent(arg0);
}
private void whetherConditionIsRight(float offset) {
if (mRect.isEmpty()) {
mRect.set(getLeft(), getTop(), getRight(), getBottom());
}
handleDefault = false;
layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
}
private void onTouchActionUp() {
if (!mRect.isEmpty()) {
recoveryPosition();
}
}
private void recoveryPosition() {
TranslateAnimation ta = null;
ta = new TranslateAnimation(getLeft(), mRect.left, 0, 0);
ta.setDuration(300);
startAnimation(ta);
layout(mRect.left, mRect.top, mRect.right, mRect.bottom);
mRect.setEmpty();
handleDefault = true;
}
}
看吧,很簡(jiǎn)單的,如果大家還有什么方法,可以多多交流。
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android ScrollView的頂部下拉和底部上拉回彈效果
- Android RecyclerView上拉加載更多功能回彈實(shí)現(xiàn)代碼
- android仿QQ個(gè)人主頁(yè)下拉回彈效果
- Android界面上拉下拉的回彈效果實(shí)例代碼
- Android ReboundScrollView仿IOS拖拽回彈效果
- Android仿IOS回彈效果 支持任何控件
- Android ScrollView實(shí)現(xiàn)橫向和豎向拖動(dòng)回彈效果
- Android自定義ScrollView實(shí)現(xiàn)放大回彈效果
- Android自定義控件仿ios下拉回彈效果
- Android基于reclyview實(shí)現(xiàn)列表回彈動(dòng)畫效果
相關(guān)文章
Android調(diào)用系統(tǒng)的發(fā)郵件功能的小例子
這篇文章介紹了Android調(diào)用系統(tǒng)的發(fā)郵件功能的小例子,有需要的朋友可以參考一下2013-08-08
Android 高仿微信朋友圈動(dòng)態(tài)支持雙擊手勢(shì)放大并滑動(dòng)查看圖片效果
這篇文章主要介紹了Android 高仿微信朋友圈動(dòng)態(tài)支持雙擊手勢(shì)放大并滑動(dòng)查看圖片效果,需要的朋友參考下2017-01-01
Android自定義控件實(shí)現(xiàn)通用驗(yàn)證碼輸入框
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)通用驗(yàn)證碼輸入框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
Android 屬性動(dòng)畫原理與DataBinding
這篇文章主要介紹了Android 屬性動(dòng)畫原理與DataBinding的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android利用animation-list實(shí)現(xiàn)幀動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android利用animation-list實(shí)現(xiàn)幀動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android編程自定義搜索框?qū)崿F(xiàn)方法【附demo源碼下載】
這篇文章主要介紹了Android編程自定義搜索框?qū)崿F(xiàn)方法,涉及Android界面布局、數(shù)據(jù)加載、事件響應(yīng)等相關(guān)操作技巧,并附帶完整demo源碼供讀者下載參考,需要的朋友可以參考下2017-12-12
Android ListView實(shí)現(xiàn)圖文列表顯示
這篇文章主要為大家詳細(xì)介紹了Android ListView實(shí)現(xiàn)圖文列表顯示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Android編程之Activity中onDestroy()調(diào)用分析
這篇文章主要介紹了Android編程之Activity中onDestroy()調(diào)用方法,針對(duì)onDestroy引起的內(nèi)存泄露及解決方法進(jìn)行了分析,并給出了解決方案,需要的朋友可以參考下2015-12-12
Android UI:ListView - SimpleAdapter實(shí)例詳解
這篇文章主要介紹了Android UI:ListView - SimpleAdapter實(shí)例詳解,SimpleAdapter是擴(kuò)展性最好的適配器,可以定義各種你想要的布局,而且使用很方便,需要的朋友可以參考下2016-11-11

