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

Rxjava实践-用Rxjava代替handler实现无限轮播图

2017-05-14 14:40 483 查看

效果图



配置

使用 rxjava rxandroid glide

//glide
compile 'com.github.bumptech.glide:glide:3.7.0'

compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'


Interval 操作符

创建一个按固定时间间隔发射整数序列的Observable

private void stop() {
if(disposable!=null&&!disposable.isDisposed()) disposable.dispose();
}
private void start() {
disposable = Observable.interval(delay, delay, TimeUnit.SECONDS)// 5s的延迟,5s的循环时间
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
vpImage.setCurrentItem(vpImage.getCurrentItem() + 1);
}
});
}


ViewPager事件的处理

在ViewPager滚动时 动态改变指示器的大小,根据ViewPager选择状态设置指示器的背景,根据ViewPager滑动状态开启与结束自动轮播

vpImage.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
position = position%imgLength;
llDot.getChildAt(position).setScaleX(1.5f - positionOffset * 0.5f);
llDot.getChildAt(position).setScaleY(1.5f - positionOffset * 0.5f);
llDot.getChildAt((position + 1)%imgLength).setScaleX(1f + positionOffset * 0.5f);
llDot.getChildAt((position + 1)%imgLength).setScaleY(1f + positionOffset * 0.5f);
}

@Override
public void onPageSelected(int position) {
for(int i= 0;i<llDot.getChildCount();i++){
llDot.getChildAt(i).setBackgroundResource(position%imgLength==i?R.drawable.dot_selected:R.drawable.dot_unselected);
}
}
@Override
public void onPageScrollStateChanged(int state) {
switch (state){
case  ViewPager.SCROLL_STATE_IDLE:
start();
break;
case  ViewPager.SCROLL_STATE_DRAGGING:
stop();
break;
case  ViewPager.SCROLL_STATE_SETTLING:
stop();
break;
}
}
});


完整带码

public class AutoViewPager extends FrameLayout {
private Context context;
private String[] images;
private View contentView;
private ViewPager vpImage;
private LinearLayout llDot;
private List<View> viewList;//ViewPager里的View

private int dotSize = 15;//指示器大小
private int dotSpace = 15;//指示器间距
private int delay = 3;//自动刷新时间间隔
private int MAX = 50000;//新闻轮播最大值
private OnPagerClickListener onPagerClickListener;
private int imgLength;//图片数组长度
private Disposable disposable;

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

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

public AutoViewPager(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
initView();
}

private void initView() {
contentView = LayoutInflater.from(context).inflate(R.layout.autoviewpager_layout, this, true);
vpImage = (ViewPager) findViewById(R.id.vp_image);
llDot = (LinearLayout) findViewById(R.id.ll_dot);
}

public void setImages(final String[] images) {
this.images = images;
imgLength =images.length;
viewList = new ArrayList<>();
for (String img : images) {
View view = LayoutInflater.from(context).inflate(R.layout.autoviewpager_content_layout,null);
ImageView ivImage = (ImageView) view.findViewById(R.id.iv_image);
TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);
Glide.with(context).load(img).centerCrop().into(ivImage);
viewList.add(view);
}
vpImage.setAdapter(new AutoViewPagerAdapter());
int mid = MAX/2 - MAX%imgLength;
vpImage.setCurrentItem(mid);//将viewPager当前位置设置为最大值的中间位置
setIndicator();//初始化指示器
start();//开始轮播
vpImage.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { position = position%imgLength; llDot.getChildAt(position).setScaleX(1.5f - positionOffset * 0.5f); llDot.getChildAt(position).setScaleY(1.5f - positionOffset * 0.5f); llDot.getChildAt((position + 1)%imgLength).setScaleX(1f + positionOffset * 0.5f); llDot.getChildAt((position + 1)%imgLength).setScaleY(1f + positionOffset * 0.5f); } @Override public void onPageSelected(int position) { for(int i= 0;i<llDot.getChildCount();i++){ llDot.getChildAt(i).setBackgroundResource(position%imgLength==i?R.drawable.dot_selected:R.drawable.dot_unselected); } } @Override public void onPageScrollStateChanged(int state) { switch (state){ case ViewPager.SCROLL_STATE_IDLE: start(); break; case ViewPager.SCROLL_STATE_DRAGGING: stop(); break; case ViewPager.SCROLL_STATE_SETTLING: stop(); break; } } });
}

private void stop() {
if(disposable!=null&&!disposable.isDisposed()) disposable.dispose();
}
private void start() {
disposable = Observable.interval(delay, delay, TimeUnit.SECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
vpImage.setCurrentItem(vpImage.getCurrentItem() + 1);
}
});
}

private void setIndicator() {
llDot.removeAllViews();// 记得创建前先清空数据,否则会受遗留数据的影响。
for (int i = 0; i < imgLength; i++) {
View view = new View(context);
view.setBackgroundResource(R.drawable.dot_unselected);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(dotSize, dotSize);
layoutParams.leftMargin = dotSpace / 2;
layoutParams.rightMargin = dotSpace / 2;
layoutParams.topMargin = dotSpace / 2;
layoutParams.bottomMargin = dotSpace / 2;
llDot.addView(view, layoutParams);
}
llDot.getChildAt(0).setBackgroundResource(R.drawable.dot_selected);
}

class AutoViewPagerAdapter extends PagerAdapter {

@Override
public int getCount() {
return MAX;
}

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

@Override
public Object instantiateItem(ViewGroup container, final int position) {
final int newPosition = position % imgLength;
View view = viewList.get(newPosition);
if (onPagerClickListener != null) {
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onPagerClickListener.onPagerClick(newPosition);
}
});
}
container.addView(view);
return view;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}

interface OnPagerClickListener {
void onPagerClick(int position);
}

public void setOnPagerClickListener(OnPagerClickListener onPagerClickListener) {
this.onPagerClickListener = onPagerClickListener;
}
}


public class MainActivity extends AppCompatActivity {

private AutoViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}

private void initData() {
String[] imageUrls = {"https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3261561758,2570279118&fm=23&gp=0.jpg",
"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494739654901&di=2b2c84354acd353e95070af01a1b7181&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fforum%2Fpic%2Fitem%2Fd6ca7bcb0a46f21fb16c5ee4f6246b600c33ae28.jpg",
"https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1595855163,1815593911&fm=23&gp=0.jpg",
"https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3520325925,1812633280&fm=23&gp=0.jpg",
"https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2352583640,615617582&fm=23&gp=0.jpg"};
viewPager.setImages(imageUrls);
viewPager.setOnPagerClickListener(new AutoViewPager.OnPagerClickListener() {
@Override
public void onPagerClick(int position) {
Toast.makeText(getApplicationContext(),"点击"+position,Toast.LENGTH_SHORT).show();
}
});
}

private void initView() {
viewPager = (AutoViewPager)findViewById(R.id.autoViewPager);
}
}


demo地址:https://github.com/REIGE/AutoViewPager
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  rxjava 轮播图 handler