Skip to content

Commit

Permalink
v2.0.0 更加丝滑
Browse files Browse the repository at this point in the history
  • Loading branch information
wenld committed Dec 13, 2017
1 parent 0977c74 commit a013401
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 69 deletions.
3 changes: 3 additions & 0 deletions .idea/dictionaries/Administrator.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,6 @@ protected void onCreate(Bundle savedInstanceState) {
}
```

> **· v 2.0.0**
> 更换无限循环方式,使操作更加流畅
> 优化代码,真实循环采用观察者模式
8 changes: 4 additions & 4 deletions wenldbanner/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ android {
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
provided fileTree(dir: 'libs', include: ['*.jar'])
androidTestProvided('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})

compile deps.appcompatV7
testCompile 'junit:junit:4.12'
provided deps.appcompatV7
testProvided 'junit:junit:4.12'
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@
* Author: 温利东 on 2017/11/6 13:49.
* blog: http://www.jianshu.com/u/99f514ea81b3
* github: https://github.com/LidongWen
* <p>
* describe:
* 控制是否执行自动翻页
* 控制开始与结束
* 翻页时间间隔
*/

public class AutoTurnViewPager<T> extends LoopViewPager {
Expand Down Expand Up @@ -101,7 +106,7 @@ public void run() {
if (autoTurnViewPager != null) {
if (autoTurnViewPager.isRunning() && autoTurnViewPager.isCanTurn()) {
int page = autoTurnViewPager.getCurrentItem() + (autoTurnViewPager.isReverse() ? -1 : 1);
if (autoTurnViewPager.getAdapter().getCount() <= page) {
if (!autoTurnViewPager.getAdapter().isRealCanLoop() && (page >= autoTurnViewPager.getAdapter().getRealCount() || page < 0)) {
autoTurnViewPager.setRunning(false);
return;
}
Expand Down
53 changes: 24 additions & 29 deletions wenldbanner/src/main/java/com/wenld/wenldbanner/LoopViewPager.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.wenld.wenldbanner;

import android.content.Context;
import android.database.DataSetObserver;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
Expand Down Expand Up @@ -31,8 +32,21 @@ public void setAdapter(WenldPagerAdapter adapter) {
mAdapter.setCanLoop(canLoop);
mAdapter.setViewPager(this);
super.setAdapter(mAdapter);
setSuperCurrentItem(mAdapter.startAdapterPosition(0), false);

mAdapter.registerRealCanLoopObserver(new DataSetObserver() {
@Override
public void onChanged() {
int cur = getCurrentItem();
mAdapter.notifyDataSetChanged(true);
setSuperCurrentItem(mAdapter.startAdapterPosition(cur), false);
}

setCurrentItem(0, false);
@Override
public void onInvalidated() {
super.onInvalidated();
}
});
}

public boolean isTouchScroll() {
Expand All @@ -46,12 +60,16 @@ public void setTouchScroll(boolean isCanScroll) {

@Override
public void setCurrentItem(int item) {
super.setCurrentItem(mAdapter.realPostiton2AdapterPostiton(item));
super.setCurrentItem(mAdapter.realPostiton2AdapterPosition(getSuperCurrentItem(), item));
}

public void setSuperCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item, smoothScroll);
}

@Override
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(mAdapter.realPostiton2AdapterPostiton(item), smoothScroll);
super.setCurrentItem(mAdapter.realPostiton2AdapterPosition(getSuperCurrentItem(), item), smoothScroll);
}

public int getSuperCurrentItem() {
Expand Down Expand Up @@ -144,33 +162,10 @@ public void onPageScrolled(int position, float positionOffset,
getmOuterPageChangeListeners().get(i).onPageScrolled(realPosition,
positionOffset, positionOffsetPixels);
}
// if (mOuterPageChangeListener != null) {
// mOuterPageChangeListener.onPageScrolled(realPosition,
// positionOffset, positionOffsetPixels);
// if (realPosition != mAdapter.getRealCount() - 1) {
// mOuterPageChangeListener.onPageScrolled(realPosition,
// positionOffset, positionOffsetPixels);
// } else {
// if (positionOffset > .5) {
// mOuterPageChangeListener.onPageScrolled(0, 0, 0);
// } else {
// mOuterPageChangeListener.onPageScrolled(realPosition,
// 0, 0);
// }
// }
// }
}

@Override
public void onPageScrollStateChanged(int state) {
if (state == SCROLL_STATE_IDLE) {
//如果是首尾 就更换位置
int currentItem = getSuperCurrentItem();
int realAdapterPosition = mAdapter.headFootPosition2AdapterPosition(currentItem);
if (currentItem != realAdapterPosition) {
setCurrentItem(getRealItem(currentItem), false);
}
}
for (int i = 0; i < getmOuterPageChangeListeners().size(); i++) {
getmOuterPageChangeListeners().get(i).onPageScrollStateChanged(state);
}
Expand Down Expand Up @@ -202,15 +197,15 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) {
public void setCanLoop(boolean canLoop) {
this.canLoop = canLoop;
if (mAdapter == null) return;
int position = getCurrentItem();

mAdapter.setCanLoop(canLoop);
mAdapter.notifyDataSetChanged(true);
setCurrentItem(position,false);

}

private int getClientWidth() {
return getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
}

PageTransformer transformer;

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.wenld.wenldbanner.adapter;

import android.database.DataSetObservable;
import android.database.DataSetObserver;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;

import com.wenld.wenldbanner.LoopViewPager;
import com.wenld.wenldbanner.OnPageClickListener;
import com.wenld.wenldbanner.helper.Holder;
import com.wenld.wenldbanner.helper.ViewHolder;
Expand All @@ -17,21 +19,29 @@
* Author: 温利东 on 2017/11/2 16:38.
* blog: http://www.jianshu.com/u/99f514ea81b3
* github: https://github.com/LidongWen
* <p>
* 无限循环PageAdapter
* 1、数量无限大
* 2、适配器下标转换真实数据下标
* 3、真实下标转换成相应的适配器下标
* 4、控制是否能无限循环 当canLoop与getRealCount>1的时候
*/

public class WenldPagerAdapter<T> extends PagerAdapter {
final String TAG = "WenldPagerAdapter";
DataSetObservable mRealCanLoopObservable = new DataSetObservable(); //realCanLoop变化模式
protected List<T> mDatas;
Holder holderCreator;
private boolean canLoop = true;
LoopViewPager wenldViewPager;
private boolean canLoop;
private boolean realCanLoop = true;
ViewPager wenldViewPager;
private LinkedList<ViewHolder> mViewHolderCache = null;
private LinkedList<ViewHolder> mViewHolderUsedCache = null;
private OnPageClickListener onItemClickListener;

@Override
public int getCount() {
return canLoop ? (getRealCount() > 1 ? getRealCount() + 2 : getRealCount()) : getRealCount();
return realCanLoop ? Integer.MAX_VALUE : getRealCount();
}

public int getRealCount() {
Expand All @@ -47,10 +57,10 @@ public Object instantiateItem(ViewGroup container, int position) {

public boolean myNotify = false;

public void notifyDataSetChanged(boolean isRefresh){
myNotify=isRefresh;
public void notifyDataSetChanged(boolean isRefresh) {
myNotify = isRefresh;
super.notifyDataSetChanged();
myNotify=false;
myNotify = false;
}

@Override
Expand All @@ -62,14 +72,20 @@ public int getItemPosition(Object object) {
}
}

public int realPostiton2AdapterPostiton(int position) {
if (canLoop) {
int realCount = getRealCount();
if (realCount == 0)
return 0;
return position + 1;
public int realPostiton2AdapterPosition(int curAdapterPosition, int realPosition) {
if (realCanLoop) {
int oldRealCur = adapterPostiton2RealDataPosition(curAdapterPosition);
int toCur = curAdapterPosition + realPosition - oldRealCur;
return toCur;
}
return position;
return realPosition >= 0 ? realPosition : 0;
}

public int startAdapterPosition(int dataPosition) {
if (realCanLoop) {
return getRealCount() * 300 + dataPosition;
}
return dataPosition;
}

/**
Expand All @@ -82,25 +98,7 @@ public int adapterPostiton2RealDataPosition(int adapterPosition) {
int realCount = getRealCount();
if (realCount == 0)
return 0;

if (canLoop) {
// 如果只有一个数据
if (realCount == 1) {
return 0;
} else {
// 第0个即最后一个
if (adapterPosition == 0) {
return realCount - 1;
// 最后一个 即第0个数据
} else if (adapterPosition == getCount() - 1) {
return 0;
} else {
return adapterPosition - 1;
}
}
}
int realPosition = adapterPosition % realCount;
return realPosition;
return adapterPosition % realCount;
}

/**
Expand Down Expand Up @@ -148,29 +146,37 @@ public void destroyItem(ViewGroup container, int position, Object object) {

public void setCanLoop(boolean canLoop) {
this.canLoop = canLoop;
boolean loop = canLoop ? (getRealCount() > 1 ? true : false) : false;
if (realCanLoop ^ loop) {
realCanLoop = loop;
mRealCanLoopObservable.notifyChanged();
}
}

public void setOnItemClickListener(OnPageClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}

public void setViewPager(LoopViewPager viewPager) {
public void setViewPager(ViewPager viewPager) {
this.wenldViewPager = viewPager;
}

public WenldPagerAdapter(Holder holderCreator) {
this.holderCreator = holderCreator;
mViewHolderCache = new LinkedList<>();
mViewHolderUsedCache = new LinkedList<>();
setCanLoop(true);
}

private WenldPagerAdapter(Holder holderCreator, List<T> datas) {
this.holderCreator = holderCreator;
this.mDatas = datas;
setCanLoop(true);
}

public void setmDatas(List<T> mDatas) {
this.mDatas = mDatas;
setCanLoop(canLoop);
}

public List<T> getmDatas() {
Expand Down Expand Up @@ -200,7 +206,7 @@ public View getView(int position, ViewGroup container) {
}

if (holder == null) {
holder = holderCreator.createView(wenldViewPager.getContext(), container, realPosition,viewType);
holder = holderCreator.createView(wenldViewPager.getContext(), container, realPosition, viewType);
}
mViewHolderUsedCache.add(holder);
holder.getConvertView().setOnClickListener(new View.OnClickListener() {
Expand All @@ -221,4 +227,13 @@ public void onClick(View v) {
holder.setPosition(position);
return holder.getConvertView();
}

public boolean isRealCanLoop() {
return realCanLoop;
}

public void registerRealCanLoopObserver(DataSetObserver observer) {
mRealCanLoopObservable.registerObserver(observer);
}

}

0 comments on commit a013401

Please sign in to comment.