您的位置:首页 > 其它

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

2012-05-30 16:14 239 查看
ViewPager 滑动速度设置,并实现点击按钮滑动

使用过ViewPager的童鞋,都会感觉到设置界面滑动挺简单的。但是有时候却满足不了UI设计的要求。
在用这个ViewPager的时候我遇到两个问题,不知道你们遇到没有。这里做个笔记,总结一下:

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

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

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

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





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

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

布局main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="400dip" />

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="←"
android:textSize="25dip" />
<Button
android:id="@+id/right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="100dip"
android:text="→"
android:textSize="25dip" />
</LinearLayout>

</LinearLayout>


ViewPagerDemoActivity类:

package blog.csdn.net.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 List<View> mListViews;

@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 = new ArrayList<View>();
for(int i= 1; i<= PAGER_NUM; i++){
MyPagerView view = new MyPagerView(this, i);
mListViews.add(view);
}
mYLeiPageAdapter = new YLeiPageAdapter(this, mListViews);
mViewPager.setAdapter(mYLeiPageAdapter);
mViewPager.setOnPageChangeListener(mOnPageChangeListener);

/*<span style="color:#ff0000;">主要代码段</span>*/
try {
Field mField = ViewPager.class.getDeclaredField("mScroller");
mField.setAccessible(true);
//<span style="color:#ff0000;">设置加速度 ,通过改变FixedSpeedScroller这个类中的mDuration来改变动画时间(如mScroller.setmDuration(mMyDuration);)
</span>   mScroller = new FixedSpeedScroller(mViewPager.getContext(), new AccelerateInterpolator());
mField.set(mViewPager, mScroller);
} catch (Exception e) {
e.printStackTrace();
}
}

private OnClickListener mOnClickListener = new OnClickListener(){
@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 = new OnPageChangeListener(){

@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.csdn.net.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;
}

}


/article/9069766.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐