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);
}
}
});
执行顺序:
- onPageScrollStateChanged()// state == ViewPager.SCROLL_STATE_DRAGGING 正在滑动状态
- onPageScrolled() //滑动状态
- onPageScrollStateChanged() // state ==SCROLL_STATE_SETTLING 自动沉降状态
- onPageSelected() // 选中状态
- onPageScrolled() //滑动状态
- 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自己的滑动黑边阴影