您的位置:首页 > 编程语言

利用viewpager实现图片左右循环滑动效果

2015-12-02 11:28 597 查看
再次转载:http://blog.csdn.net/finddreams/article/details/44619589这个里面实现的效果,会更顺畅,真的感觉不一样,强烈推荐!里面有项目git地址!自己下载了试着封装进自己项目,膜拜大神!

转载自:http://blog.csdn.net/xiaanming/article/details/8966621

自己的代码和原来的稍微有些不同,也就是加了个自动循环。其他差不多的。

为了自己以后用起来方便,我决定还是自己再写一遍。

其实网上的demo很多,但是要处理当2张或者3张图片的时候 ,有bug。

 PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围。

意思就是pagerAdapter预加载三张图片的,当你预加载少于三张,会有bug。

贴出来不会崩的代码,无论几张。

package com.example.viewpagerpractice;

import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener{
/**
* ViewPager
*/
private ViewPager viewPager;

/**
* 装点点的ImageView数组
*/
private ImageView[] tips;

/**
* 装ImageView数组
*/
private ImageView[] mImageViews;

/**
* 图片资源id
*/
private int[] imgIdArray ;
private boolean isLoop = true;
private Handler handler = new Handler() {

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);

viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setView();
ViewGroup group = (ViewGroup)findViewById(R.id.viewGroup);
viewPager = (ViewPager) findViewById(R.id.viewPager);

//载入图片资源ID
imgIdArray = new int[]{R.drawable.shanshui, R.drawable.beijing//, R.drawable.resultshow//, R.drawable.rosebull,
};

//将点点加入到ViewGroup中
tips = new ImageView[imgIdArray.length];
for(int i=0; i<tips.length; i++){
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(new ViewGroup.LayoutParams(10,10));
tips[i] = imageView;
if(i == 0){
tips[i].setBackgroundResource(R.drawable.dot_track_blue);
}else{
tips[i].setBackgroundResource(R.drawable.dot_track_red);
}

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
layoutParams.leftMargin = 5;
layoutParams.rightMargin = 5;
group.addView(imageView, layoutParams);
}

//将图片装载到数组中
mImageViews = new ImageView[imgIdArray.length];
for(int i=0; i<mImageViews.length; i++){
ImageView imageView = new ImageView(this);
mImageViews[i] = imageView;
imageView.setBackgroundResource(imgIdArray[i]);
}

//设置Adapter
viewPager.setAdapter(new MyAdapter());
//设置监听,主要是设置点点的背景
viewPager.setOnPageChangeListener(this);
//设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动
viewPager.setCurrentItem((mImageViews.length) * 100);

}

private void setView() {
// 自动切换页面功能
new Thread(new Runnable() {

@Override
public void run() {
while (isLoop) {
SystemClock.sleep(3000);
handler.sendEmptyMessage(0);
}
}
}).start();
}

/**
*
* @author xiaanming
*
*/
public class MyAdapter extends PagerAdapter {

@Override
public int getCount() {
return Integer.MAX_VALUE;
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}

@Override
public void destroyItem(View container, int position, Object object) {
if(mImageViews.length>3){
((ViewPager)container).removeView(mImageViews[position % mImageViews.length]);
}else{
//  ((ViewPager)container).removeView(mImageViews[position % mImageViews.length]);
}
}

/**
* 载入图片进去,用当前的position 除以 图片数组长度取余数是关键
*/
@Override
public Object instantiateItem(View container, int position) {
if(mImageViews.length>3) {
((ViewPager) container).addView(mImageViews[position % mImageViews.length], 0);
}else {
try {
((ViewPager) container).addView(mImageViews[position % mImageViews.length], 0);
} catch (Exception e) {
//handler something
}
}
return mImageViews[position % mImageViews.length];
}

}

@Override
public void onPageScrollStateChanged(int arg0) {

}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {

}

@Override
public void onPageSelected(int arg0) {
setImageBackground(arg0 % mImageViews.length);
}

/**
* 设置选中的tip的背景
* @param selectItems
*/
private void setImageBackground(int selectItems){
for(int i=0; i<tips.length; i++){
if(i == selectItems){
tips[i].setBackgroundResource(R.drawable.dot_track_blue);
}else{
tips[i].setBackgroundResource(R.drawable.dot_track_red);
}
}
}

}

XML贴出来:

<FrameLayout 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="wrap_content" />

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<LinearLayout
android:id="@+id/viewGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="30dp"
android:gravity="center_horizontal"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>

</FrameLayout>

我自己试了下三张,二张,四张的时候,都没有出现任何问题。

最后膜拜一下大神。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息