android 滑动速度,android viewPager滑动速度设置

本文介绍如何在Android中自定义ViewPager的滑动速度和动画效果,包括通过设置FixedSpeedScroller和Interpolator来改变滑动速度,以及实现点击按钮平滑切换页面的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ViewPager 滑动速度设置,并实现点击按钮滑动

使用过ViewPager的童鞋,都会感觉到设置界面滑动挺简单的。但是有时候却满足不了UI设计的要求。

在用这个ViewPager的时候我遇到两个问题,不知道你们遇到没有。这里做个笔记,总结一下:

第一个问题是,ViewPager在我们滑动放手后,速度和动画的变化率是固定的。

第二个问题的,我们再添加左右按钮后,如点击滑动到前一页面(通过mViewPager.setCurrentItem(viewID, true);),一闪就了,用户感觉不到动画效果。

其实这两个问题的的根源都是一样的。我们能都改变速度和动画的变化率,那么就可以解决了。

还是写个简单的demo,先看效果图:

1338363878_7891.png               

1338364175_8391.png

右边这张是滑动中的。滑动放手后,动画的变化率设为加速度,也就是先慢后快。这里改变了Interpolator。

每按下向左键,滑动速度会快0.1秒。每按下向右键,滑动速度会慢0.1秒。 所以你不停的按向右键,那么将会变得很慢很慢。

布局main.xml:

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical">

android:id="@+id/viewpager"

android:layout_width="fill_parent"

android:layout_height="400dip"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="horizontal">

android:id="@+id/left"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="←"

android:textSize="25dip"/>

android:id="@+id/right"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginRight="100dip"

android:text="→"

android:textSize="25dip"/>

ViewPagerDemoActivity类:

package blog.youkuaiyun.com.liyulei316686082;

import java.lang.reflect.Field;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.support.v4.view.ViewPager;

import android.support.v4.view.ViewPager.OnPageChangeListener;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.animation.AccelerateInterpolator;

import android.widget.Button;

public class ViewPagerDemoActivity extends Activity {

/** Called when the activity is first created. */

private ViewPager mViewPager=null;

private Button mLeft=null;

private Button mRight=null;

private static final int PAGER_NUM=10;//10个页面

private int mCurrentViewID=0;         //当前页面

private int mMyDuration=100;          //持续时间

private FixedSpeedScroller mScroller;

private YLeiPageAdapter mYLeiPageAdapter=null;

private ListmListViews;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mViewPager= (ViewPager)findViewById(R.id.viewpager);

mLeft= (Button)findViewById(R.id.left);

mRight= (Button)findViewById(R.id.right);

mLeft.setOnClickListener(mOnClickListener);

mRight.setOnClickListener(mOnClickListener);

mListViews=newArrayList();

for(int i=1; i<= PAGER_NUM; i++){

MyPagerView view=newMyPagerView(this, i);

mListViews.add(view);

}

mYLeiPageAdapter=newYLeiPageAdapter(this, mListViews);

mViewPager.setAdapter(mYLeiPageAdapter);

mViewPager.setOnPageChangeListener(mOnPageChangeListener);

/*主要代码段*/

try {

Field mField=ViewPager.class.getDeclaredField("mScroller");

mField.setAccessible(true);

//设置加速度 ,通过改变FixedSpeedScroller这个类中的mDuration来改变动画时间(如mScroller.setmDuration(mMyDuration);)

mScroller=newFixedSpeedScroller(mViewPager.getContext(), new AccelerateInterpolator());

mField.set(mViewPager, mScroller);

} catch (Exception e) {

e.printStackTrace();

}

}

private OnClickListener mOnClickListener=newOnClickListener(){

@Override

public void onClick(View v) {

switch (v.getId()){

case R.id.left:

if(mCurrentViewID != 0){

mCurrentViewID--;

mViewPager.setCurrentItem(mCurrentViewID, true);

}

mMyDuration -=100;

mScroller.setmDuration(mMyDuration);

break;

case R.id.right:

if(mCurrentViewID != PAGER_NUM-1){

mCurrentViewID++;

mViewPager.setCurrentItem(mCurrentViewID, true);

}

mMyDuration += 100;

mScroller.setmDuration(mMyDuration);

break;

}

}};

private OnPageChangeListener mOnPageChangeListener=newOnPageChangeListener(){

@Override

public void onPageScrollStateChanged(int arg0) {

// TODO Auto-generated method stub

}

@Override

public void onPageScrolled(int arg0, float arg1, int arg2) {

// TODO Auto-generated method stub

}

@Override

public void onPageSelected(int currentID) {

// TODO Auto-generated method stub

mCurrentViewID=currentID;

}};

}

FixedSpeedScroller类:

package blog.youkuaiyun.com.liyulei316686082;

import android.content.Context;

import android.view.animation.Interpolator;

import android.widget.Scroller;

public class FixedSpeedScroller extends Scroller {

private int mDuration=1500;

public FixedSpeedScroller(Context context) {

super(context);

}

public FixedSpeedScroller(Context context, Interpolator interpolator) {

super(context, interpolator);

}

@Override

public void startScroll(int startX, int startY, int dx, int dy, int duration) {

// Ignore received duration, use fixed one instead

super.startScroll(startX, startY, dx, dy, mDuration);

}

@Override

public void startScroll(int startX, int startY, int dx, int dy) {

// Ignore received duration, use fixed one instead

super.startScroll(startX, startY, dx, dy, mDuration);

}

public void setmDuration(int time){

mDuration=time;

}

public int getmDuration(){

return mDuration;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值