Android編程ViewPager回彈效果實(shí)例分析
本文實(shí)例講述了Android編程ViewPager回彈效果。分享給大家供大家參考,具體如下:
其實(shí)在我們很多應(yīng)用中都看到當(dāng)ViewPager滑到第一頁或者最后一頁的時(shí)候,如果再滑動(dòng)的時(shí)候,就會(huì)有一個(gè)緩沖的過程,也就是回彈效果。之前在研究回彈效果的時(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();//用來記錄初始位置
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è)置總共有多少頁,請(qǐng)記得調(diào)用它
public void setpagerCount(int pagerCount) {
this.pagerCount = pagerCount;
}
//這是當(dāng)前是第幾頁,請(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è)人主頁下拉回彈效果
- 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)文章
在AndroidManifest.xml中uses-sdk內(nèi)屬性意思
本文為大家講解下minSdkVersion、targetSdkVersion、maxSdkVersion、target API level四個(gè)數(shù)值的意思與區(qū)別,感興趣的朋友可以參考下哈2013-06-06
Android實(shí)現(xiàn)簡(jiǎn)單C/S聊天室應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單C/S聊天室應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Android通過多點(diǎn)觸控的方式對(duì)圖片進(jìn)行縮放的實(shí)例代碼
這篇文章主要介紹了Android通過多點(diǎn)觸控的方式對(duì)圖片進(jìn)行縮放的實(shí)例代碼,完成了點(diǎn)擊圖片就能瀏覽大圖的功能,并且在瀏覽大圖的時(shí)候還可以通過多點(diǎn)觸控的方式對(duì)圖片進(jìn)行縮放。2018-05-05
Android Toast使用的簡(jiǎn)單小結(jié)(推薦)
這篇文章主要介紹了Android Toast使用的簡(jiǎn)單小結(jié),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Android checkbox的listView(多選,全選,反選)具體實(shí)現(xiàn)方法
由于listview的一些特性,剛開始寫這種需求的功能的時(shí)候都會(huì)碰到一些問題,重點(diǎn)就是存儲(chǔ)每個(gè)checkbox的狀態(tài)值,在這里分享出了完美解決方法:2013-06-06
Android實(shí)現(xiàn)可復(fù)用的篩選頁面
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可復(fù)用的篩選頁面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
Android嵌套滾動(dòng)NestedScroll的實(shí)現(xiàn)了解一下
嵌套滾動(dòng)已經(jīng)算一個(gè)比較常見的特效了,這篇文章主要介紹了Android嵌套滾動(dòng)NestedScroll的實(shí)現(xiàn)了解一下,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06
Android使用URL讀取網(wǎng)絡(luò)資源的方法
這篇文章主要為大家詳細(xì)介紹了Android使用URL讀取網(wǎng)絡(luò)資源的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10

