ViewPager 之滑动

ViewPager 之滑动:
绑定滑动事件:
viewPager .addOnPageChangeListener( new ViewPager.OnPageChangeListener() {
会走如下三个方法

@Override
public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels) {
页面滑动时调用,也就是页面在停止滑动之前都调用此方法
position:当前页面
positionOffset:当前页面偏移的百分比
positionOffsetPixels:当前页面移动的像素
}

@Override
public void onPageSelected( int position) {页面跳转完成后调用
position:当前选中的那上页面的下标
}

@Override
public void onPageScrollStateChanged( int state) {页面状态 发生改变时调用
state 的值有三个0,1,2
0表示:什么也没做
1:正在滑动
2 :已经完成滑动
mViewpager .setCurrentItem(0,false);指定当前显示 哪 个页面
mViewpager .getCurrentItem()获取当前显示 的是第几个页面
if( mViewpager .getCurrentItem()==0){
mViewpager .setCurrentItem(5);
}
}
});
执行顺序:
  1. onPageScrollStateChanged()// state == ViewPager.SCROLL_STATE_DRAGGING  正在滑动状态
  2. onPageScrolled()  //滑动状态
  3. onPageScrollStateChanged() // state ==SCROLL_STATE_SETTLING  自动沉降状态
  4. onPageSelected() // 选中状态
  5. onPageScrolled()  //滑动状态
  6. onPageScrollStateChanged()  //state==SCROLL_STATE_IDLE   空闲状态  滑动结束
实现无限循环+自定循环+跳转循环
ViewPager. setCurrentItem(1,false);//跳转到哪个页,第二个参数是,是否有动画,false 是没有动画

缓存机制:
每次都是预加载当前显示页面的相邻页 也就是当前传入的postion 的前一页,消毁后一页的后一页

通过上面的讲解来实现一个可以自动切换加手动切换+无限循环滑动图片+带指示器功能
1,数据来源:首先要确定是加载本地图片还是网络的图片
2, 是否是一张图片
3,是否正在滑动
4,是否显示指示器
5,指示器的位置
自家义一个布局:




package com.example.wuli.mybanner;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import java.util.List;

/**
* Created by BIN on 16/10/10.
*/
public class MyTestBanner extends RelativeLayout {
private ViewPager mViewpager ;
private LinearLayout mPointLayout ;
private List<Integer> mList ;
private boolean isOne = false ;
private int mParent = LayoutParams. MATCH_PARENT ;
private int mWrap = LayoutParams. WRAP_CONTENT ;
private int mCurrent ; //当前显示位置下标

public MyTestBanner(Context context) {
this (context, null );
}

public MyTestBanner(Context context, AttributeSet attrs) {
this (context, attrs, 0 );
}

public MyTestBanner(Context context, AttributeSet attrs, int defStyleAttr) {
super (context, attrs, defStyleAttr);
initlayout();
}
public void setImage(List<Integer>imageList){
this . mList =imageList;
if ( mList .size()== 1 ){
// isOne=true;
} else {
//添加小点
addPoint();
}

initViewPager();
}
private void addPoint(){
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams. WRAP_CONTENT ,LinearLayout.LayoutParams. WRAP_CONTENT );
lp.setMargins( 10 , 10 , 10 , 10 );
for ( int i= 0 ;i< mList .size();i++) {
ImageView imageView = new ImageView(getContext());
imageView.setImageResource(R.drawable. select_point );
imageView.setLayoutParams(lp);
mPointLayout .addView(imageView);
}

switchPoint( 0 );

}
private void initlayout(){
//setOverScrollMode(OVER_SCROLL_NEVER);
mViewpager = new ViewPager(getContext());
LayoutParams params= new LayoutParams( mParent , mWrap );
mViewpager .setLayoutParams(params);
addView( mViewpager );
//小点
RelativeLayout pointParentLayout= new RelativeLayout(getContext());

LayoutParams paramsLayout= new LayoutParams( mParent , mWrap );
paramsLayout.addRule(RelativeLayout. ALIGN_PARENT_BOTTOM );

pointParentLayout.setLayoutParams(paramsLayout); //
pointParentLayout.setBackgroundResource(R.color. colorAccent );

mPointLayout = new LinearLayout(getContext());

LayoutParams params1= new LayoutParams( mWrap , mWrap );

params1.addRule(RelativeLayout. CENTER_HORIZONTAL );
mPointLayout .setPadding( 10 , 10 , 10 , 10 );
mPointLayout .setLayoutParams(params1);
pointParentLayout.addView( mPointLayout );
addView(pointParentLayout);




}
private void initViewPager(){
mViewpager .setAdapter( new MyAdapter());
mViewpager .addOnPageChangeListener( new MyChangeListener());
mViewpager .setCurrentItem( 1 , false );

}
class MyChangeListener implements ViewPager.OnPageChangeListener{

@Override
public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected( int position) {
changePosition(position);
//toChangePosition(mCurrent) ;
//联关上小点
switchPoint(toChangePosition( mCurrent ));
}

@Override
public void onPageScrollStateChanged( int state) {
if (state == ViewPager. SCROLL_STATE_IDLE ) {
int current = mViewpager.getCurrentItem();
int lastReal = mViewpager.getAdapter().getCount() - 2;
if (current == 0) {
mViewpager.setCurrentItem(lastReal, false);
} else if (current == lastReal + 1) {
mViewpager.setCurrentItem(1, false);

}
}

}
}
class MyAdapter extends PagerAdapter{

@Override
public int getCount() {
return mList .size()+ 2 ;
}

@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
changePosition(position);
ImageView imageView= new ImageView(getContext());
imageView.setImageResource( mList .get(toChangePosition( mCurrent )));
LayoutParams params= new LayoutParams( mParent , mWrap );
imageView.setLayoutParams(params);
imageView.setScaleType(ImageView.ScaleType. FIT_XY );
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View)object);

}
}
private void changePosition( int position){
mCurrent = position%( mList .size()+ 2 );

}
private int toChangePosition( int position){
int toPosition; //=position%mList.size();

toPosition = (position - 1 ) % mList .size();
if (toPosition < 0 )
toPosition += mList .size();
return toPosition;
}
private void switchPoint( int position){

for ( int i= 0 ;i< mPointLayout .getChildCount();i++){
mPointLayout .getChildAt(i).setEnabled( false );
}
mPointLayout .getChildAt(position).setEnabled( true );
// ImageView imageView=(ImageView)mPointLayout.getChildAt(0);
//imageView.getBackground();
}

}

//setOverScrollMode( OVER_SCROLL_NEVER ); 关闭view自己的滑动黑边阴影









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值