ViewPager是安卓一款强大的控件,它实现了图片,fragment等的滑动轮播,在这里我们实现了利用ViewPager实现图片无限循环并且上部带有图片轮播进度的效果,代码如下:
首先MainActivity.java
public class MainActivity extends Activity {
MyViewPager vpp;
private int[]images = new int[]{R.mipmap.img1, R.mipmap.img2, R.mipmap.img3};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vpp=(MyViewPager)findViewById(R.id.vpp);
vpp.startScroll(images);
}
}
MainActivity 的布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.gcp.myviewpager.MyViewPager
android:id="@+id/vpp"
android:layout_width="match_parent"
android:layout_height="match_parent"
></com.gcp.myviewpager.MyViewPager>
</LinearLayout>
自定义MyViewPager —-MyViewPager.java
public class MyViewPager extends LinearLayout{
private ViewPager topVp;
private RadioGroup rb_g;
private List<ImageView> imageViews ;
Context context;
public MyViewPager(Context context, AttributeSet attrs) {
super(context,attrs);
this.context=context;
View rootView= LayoutInflater.from(context).inflate(R.layout.my_view_pager,this);
topVp = (ViewPager)rootView. findViewById(R.id.vp_main);
rb_g=(RadioGroup)rootView. findViewById(R.id.rb_g);
}
public void startScroll(int[]images){
this.imageViews = new ArrayList<>();
for(int i = 0;i<images.length;i++){
ImageView imageView = new ImageView(context);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setImageResource(images[i]);
imageViews.add(imageView);
}
topVp.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return 10000;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
try {
container.addView(imageViews.get(position%imageViews.size()));
}catch (Exception e){
}
return imageViews.get(position%imageViews.size());
}
});
topVp.setCurrentItem((10000/2/imageViews.size())*imageViews.size());
initLine();
changeLine((10000/2/imageViews.size())*imageViews.size()%3);
topVp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
changeLine(position%imageViews.size());
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
public void initLine(){
RadioGroup.LayoutParams params=new RadioGroup.LayoutParams(0, RadioGroup.LayoutParams.MATCH_PARENT);
params.weight=1;
for(int i=0;i<imageViews.size();i++){
RadioButton radioButton=new RadioButton(context);
radioButton.setLayoutParams(params);
radioButton.setButtonDrawable(null);
radioButton.setBackgroundResource(R.drawable.rb_back);
radioButton.setEnabled(false);
rb_g.addView(radioButton,i);
}
}
public void changeLine(int position){
((RadioButton)(rb_g.getChildAt(position))).setChecked(true);
}
}
my_view_pager.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RadioGroup
android:id="@+id/rb_g"
android:layout_width="match_parent"
android:layout_height="10dp"
android:orientation="horizontal"></RadioGroup>
<android.support.v4.view.ViewPager
android:id="@+id/vp_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:flipInterval="0"
></android.support.v4.view.ViewPager>
</LinearLayout>
rb_back.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/select_back">
</item>
<item android:state_checked="false" android:drawable="@drawable/select_no_back">
</item>
</selector>
select_back.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFfbc400"/>
</shape>
select_no_back.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFF7F7F7"/>
</shape>