android viewPager滑动速度设置
16lz
2021-01-26
ViewPager 滑动速度设置,并实现点击按钮滑动
使用过ViewPager的童鞋,都会感觉到设置界面滑动挺简单的。但是有时候却满足不了UI设计的要求。
在用这个ViewPager的时候我遇到两个问题,不知道你们遇到没有。这里做个笔记,总结一下:
第一个问题是,ViewPager在我们滑动放手后,速度和动画的变化率是固定的。
第二个问题的,我们再添加左右按钮后,如点击滑动到前一页面(通过mViewPager.setCurrentItem(viewID, true);),一闪就了,用户感觉不到动画效果。
其实这两个问题的的根源都是一样的。我们能都改变速度和动画的变化率,那么就可以解决了。
还是写个简单的demo,先看效果图:
右边这张是滑动中的。滑动放手后,动画的变化率设为加速度,也就是先慢后快。这里改变了Interpolator。
每按下向左键,滑动速度会快0.1秒。每按下向右键,滑动速度会慢0.1秒。 所以你不停的按向右键,那么将会变得很慢很慢。
布局main.xml:
[html] view plain copy
- <?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类:
[html] view plain copy- 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;
- }
- }
更多相关文章
- android实现类似淘宝的底部滑动导航菜单
- Android(安卓)触屏事件 (单击,双击,滑动)
- Android中使用双层ViewPager2+Fragment+TabLayout 实现顶部Tab和
- Android(安卓)Switch控件修改样式
- android imageview围绕中心旋转动画
- [置顶] 搜集整理的一些博客导航
- Lottie动画在Android和Ios开发中的应用——Android篇
- Android实现自定义测滑栏
- Android轻松搞定Dialog提示动画效果