简单轮播的实现
1、适配器:BannerAdapter
【
public class BannerAdapter
extends PagerAdapter {
private List<View> viewList ;
private int size ;
public BannerAdapter(List<View> viewList) {
this. viewList = viewList ;
size = viewList.size() ;
}
@Override
public void destroyItem(ViewGroup container , int position , Object object) {
container.removeView( viewList.get(position% size)) ;
}
@Override
public Object instantiateItem(ViewGroup container , int position) {
container.addView( viewList.get(position% size)) ;
return viewList.get(position% size) ;
}
@Override
public int getCount() {
return Integer. MAX_VALUE ;
}
@Override
public boolean isViewFromObject(View view , Object object) {
return view == object ;
}
}
private List<View> viewList ;
private int size ;
public BannerAdapter(List<View> viewList) {
this. viewList = viewList ;
size = viewList.size() ;
}
@Override
public void destroyItem(ViewGroup container , int position , Object object) {
container.removeView( viewList.get(position% size)) ;
}
@Override
public Object instantiateItem(ViewGroup container , int position) {
container.addView( viewList.get(position% size)) ;
return viewList.get(position% size) ;
}
@Override
public int getCount() {
return Integer. MAX_VALUE ;
}
@Override
public boolean isViewFromObject(View view , Object object) {
return view == object ;
}
}
】
2、BannerView
【
public class BannerView
extends FrameLayout {
private static final int MSG_LOOP = 1000 ;
// 间隔时间
private static long LOOP_INTERVAL = 5000 ;
private LinearLayout mLinearPosition = null;
private ViewPager mViewPager = null;
private BannerHandler mBannerHandler = null;
// 真实显示的 banner view 集合
private List<View> viewList ;
// 真实显示的 banner view 个数
private int viewSize ;
private static class BannerHandler extends Handler {
private WeakReference<BannerView> weakReference = null;
public BannerHandler(BannerView bannerView) {
super(Looper. getMainLooper()) ;
this. weakReference = new WeakReference<BannerView>(bannerView) ;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg) ;
if ( this. weakReference == null) {
return;
}
BannerView bannerView = this. weakReference.get() ;
if ( bannerView == null || bannerView. mViewPager == null || bannerView. mViewPager.getAdapter() == null || bannerView. mViewPager.getAdapter().getCount() <= 0) {
sendEmptyMessageDelayed( MSG_LOOP , LOOP_INTERVAL) ;
return;
}
int curPos = bannerView. mViewPager.getCurrentItem() ;
curPos = ( curPos + 1) % bannerView. mViewPager.getAdapter().getCount() ;
bannerView. mViewPager.setCurrentItem( curPos) ;
sendEmptyMessageDelayed( MSG_LOOP , LOOP_INTERVAL) ;
}
}
public BannerView(Context context) {
super(context) ;
init() ;
}
public BannerView(Context context , AttributeSet attrs) {
super(context , attrs) ;
init() ;
}
public void startLoop( boolean flag) {
if (flag) {
if ( mBannerHandler == null) {
mBannerHandler = new BannerHandler( this) ;
}
mBannerHandler.sendEmptyMessageDelayed( MSG_LOOP , LOOP_INTERVAL) ;
} else {
if ( mBannerHandler != null) {
if ( mBannerHandler.hasMessages( MSG_LOOP)) {
mBannerHandler.removeMessages( MSG_LOOP) ;
}
}
}
}
private void init() {
initViewPager() ;
initLinearPosition() ;
this.addView( mViewPager) ;
this.addView( mLinearPosition) ;
}
private void initViewPager() {
mViewPager = new ViewPager(getContext()) ;
LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams. WRAP_CONTENT
, ViewGroup.LayoutParams. WRAP_CONTENT) ;
mViewPager.setLayoutParams( layoutParams) ;
mViewPager.addOnPageChangeListener( new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled( int position , float positionOffset , int positionOffsetPixels) {
Log. d( "dagger" , "position :"+position+ " positionOffset :"+positionOffset) ;
}
@Override
public void onPageSelected( int position) {
Log. d( "dagger" , "onPageSelected :"+position) ;
updateLinearPosition() ;
}
@Override
public void onPageScrollStateChanged( int state) {
}
}) ;
mViewPager.setOnTouchListener( new OnTouchListener() {
@Override
public boolean onTouch(View v , MotionEvent event) {
switch (event.getAction()){
case MotionEvent. ACTION_DOWN:
if ( mBannerHandler != null) {
if ( mBannerHandler.hasMessages( MSG_LOOP)) {
mBannerHandler.removeMessages( MSG_LOOP) ;
}
}
break;
case MotionEvent. ACTION_UP:
if ( mBannerHandler != null) {
mBannerHandler.sendEmptyMessageDelayed( MSG_LOOP , LOOP_INTERVAL) ;
}
break;
default:
break;
}
return false;
}
}) ;
}
private void initLinearPosition() {
mLinearPosition = new LinearLayout(getContext()) ;
mLinearPosition.setOrientation(LinearLayout. HORIZONTAL) ;
LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams. WRAP_CONTENT
, ViewGroup.LayoutParams. WRAP_CONTENT) ;
// 点在中间
layoutParams. gravity = Gravity. CENTER_HORIZONTAL | Gravity. BOTTOM ;
layoutParams. bottomMargin = getResources().getDimensionPixelSize(R.dimen. dimen_9dp) ;
mLinearPosition.setPadding(getResources().getDimensionPixelSize(R.dimen. dimen_9dp) , 0 , 0 , 0) ;
mLinearPosition.setLayoutParams( layoutParams) ;
}
public void setAdapter(PagerAdapter adapter) {
mViewPager.setAdapter(adapter) ;
adapter.registerDataSetObserver( mDataObserver) ;
updateLinearPosition() ;
}
private DataSetObserver mDataObserver = new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged() ;
updateLinearPosition() ;
}
@Override
public void onInvalidated() {
super.onInvalidated() ;
}
} ;
private void updateLinearPosition() {
if ( viewList != null && viewList.size() != 0) {
if ( mLinearPosition.getChildCount() != viewSize) {
int diffCnt = mLinearPosition.getChildCount() - viewSize ;
boolean needAdd = diffCnt < 0 ;
diffCnt = Math. abs( diffCnt) ;
for ( int i = 0 ; i < diffCnt ; i++) {
if ( needAdd) {
ImageView img = new ImageView(getContext()) ;
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams. WRAP_CONTENT , ViewGroup.LayoutParams. WRAP_CONTENT) ;
layoutParams. rightMargin = getResources().getDimensionPixelOffset(R.dimen. dimen_9dp) ;
img.setLayoutParams( layoutParams) ;
img.setBackgroundResource(R.drawable. banner_point) ;
mLinearPosition.addView( img) ;
} else {
mLinearPosition.removeViewAt( 0) ;
}
}
}
int curPos = mViewPager.getCurrentItem() ;
for ( int i = 0 ; i < mLinearPosition.getChildCount() ; i++) {
if ( i == ( curPos % viewSize)) {
mLinearPosition.getChildAt( i).setBackgroundResource(R.drawable. banner_point_select) ;
} else {
mLinearPosition.getChildAt( i).setBackgroundResource(R.drawable. banner_point) ;
}
}
}
}
public void setViewList(List<View> viewList) {
this. viewList = viewList ;
if (viewList != null && viewList.size() != 0) {
viewSize = viewList.size() ;
BannerAdapter bannerAdapter = new BannerAdapter(viewList) ;
setAdapter( bannerAdapter) ;
}
}
public void setTransformAnim ( boolean flag){
if (flag){
/**
* 假设现在 ViewPager 在 A 页现在滑出 B 页,则 :
A 页的 position 变化就是 ( 0, -1]
B 页的 position 变化就是 [ 1 , 0 ]
*/
mViewPager.setPageTransformer( true, new ViewPager.PageTransformer() {
private static final float MIN_SCALE = 0.75f ;
@Override
public void transformPage(View view , float position) {
int pageWidth = view.getWidth() ;
if (position < - 1)
{ // [-Infinity,-1)
// This page is way off-screen to the left.
view.setRotation( 0) ;
} else if (position <= 1) // a 页滑动至 b 页 ; a 页从 0.0 ~ -1 ; b 页从 1 ~ 0.0
{ // [-1,1]
// Modify the default slide transition to shrink the page as well
if (position < 0)
{
float mRot = ( 20f * position) ;
view.setPivotX(view.getMeasuredWidth() * 0.5f) ;
view.setPivotY(view.getMeasuredHeight()) ;
view.setRotation( mRot) ;
} else
{
float mRot = ( 20f * position) ;
view.setPivotX(view.getMeasuredWidth() * 0.5f) ;
view.setPivotY(view.getMeasuredHeight()) ;
view.setRotation( mRot) ;
}
// Scale the page down (between MIN_SCALE and 1)
// Fade the page relative to its size.
} else
{ // (1,+Infinity]
// This page is way off-screen to the right.
view.setRotation( 0) ;
}
}
}) ;
}
}
public static void setLoopInterval( long loopInterval) {
LOOP_INTERVAL = loopInterval ;
}
}
private static final int MSG_LOOP = 1000 ;
// 间隔时间
private static long LOOP_INTERVAL = 5000 ;
private LinearLayout mLinearPosition = null;
private ViewPager mViewPager = null;
private BannerHandler mBannerHandler = null;
// 真实显示的 banner view 集合
private List<View> viewList ;
// 真实显示的 banner view 个数
private int viewSize ;
private static class BannerHandler extends Handler {
private WeakReference<BannerView> weakReference = null;
public BannerHandler(BannerView bannerView) {
super(Looper. getMainLooper()) ;
this. weakReference = new WeakReference<BannerView>(bannerView) ;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg) ;
if ( this. weakReference == null) {
return;
}
BannerView bannerView = this. weakReference.get() ;
if ( bannerView == null || bannerView. mViewPager == null || bannerView. mViewPager.getAdapter() == null || bannerView. mViewPager.getAdapter().getCount() <= 0) {
sendEmptyMessageDelayed( MSG_LOOP , LOOP_INTERVAL) ;
return;
}
int curPos = bannerView. mViewPager.getCurrentItem() ;
curPos = ( curPos + 1) % bannerView. mViewPager.getAdapter().getCount() ;
bannerView. mViewPager.setCurrentItem( curPos) ;
sendEmptyMessageDelayed( MSG_LOOP , LOOP_INTERVAL) ;
}
}
public BannerView(Context context) {
super(context) ;
init() ;
}
public BannerView(Context context , AttributeSet attrs) {
super(context , attrs) ;
init() ;
}
public void startLoop( boolean flag) {
if (flag) {
if ( mBannerHandler == null) {
mBannerHandler = new BannerHandler( this) ;
}
mBannerHandler.sendEmptyMessageDelayed( MSG_LOOP , LOOP_INTERVAL) ;
} else {
if ( mBannerHandler != null) {
if ( mBannerHandler.hasMessages( MSG_LOOP)) {
mBannerHandler.removeMessages( MSG_LOOP) ;
}
}
}
}
private void init() {
initViewPager() ;
initLinearPosition() ;
this.addView( mViewPager) ;
this.addView( mLinearPosition) ;
}
private void initViewPager() {
mViewPager = new ViewPager(getContext()) ;
LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams. WRAP_CONTENT
, ViewGroup.LayoutParams. WRAP_CONTENT) ;
mViewPager.setLayoutParams( layoutParams) ;
mViewPager.addOnPageChangeListener( new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled( int position , float positionOffset , int positionOffsetPixels) {
Log. d( "dagger" , "position :"+position+ " positionOffset :"+positionOffset) ;
}
@Override
public void onPageSelected( int position) {
Log. d( "dagger" , "onPageSelected :"+position) ;
updateLinearPosition() ;
}
@Override
public void onPageScrollStateChanged( int state) {
}
}) ;
mViewPager.setOnTouchListener( new OnTouchListener() {
@Override
public boolean onTouch(View v , MotionEvent event) {
switch (event.getAction()){
case MotionEvent. ACTION_DOWN:
if ( mBannerHandler != null) {
if ( mBannerHandler.hasMessages( MSG_LOOP)) {
mBannerHandler.removeMessages( MSG_LOOP) ;
}
}
break;
case MotionEvent. ACTION_UP:
if ( mBannerHandler != null) {
mBannerHandler.sendEmptyMessageDelayed( MSG_LOOP , LOOP_INTERVAL) ;
}
break;
default:
break;
}
return false;
}
}) ;
}
private void initLinearPosition() {
mLinearPosition = new LinearLayout(getContext()) ;
mLinearPosition.setOrientation(LinearLayout. HORIZONTAL) ;
LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams. WRAP_CONTENT
, ViewGroup.LayoutParams. WRAP_CONTENT) ;
// 点在中间
layoutParams. gravity = Gravity. CENTER_HORIZONTAL | Gravity. BOTTOM ;
layoutParams. bottomMargin = getResources().getDimensionPixelSize(R.dimen. dimen_9dp) ;
mLinearPosition.setPadding(getResources().getDimensionPixelSize(R.dimen. dimen_9dp) , 0 , 0 , 0) ;
mLinearPosition.setLayoutParams( layoutParams) ;
}
public void setAdapter(PagerAdapter adapter) {
mViewPager.setAdapter(adapter) ;
adapter.registerDataSetObserver( mDataObserver) ;
updateLinearPosition() ;
}
private DataSetObserver mDataObserver = new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged() ;
updateLinearPosition() ;
}
@Override
public void onInvalidated() {
super.onInvalidated() ;
}
} ;
private void updateLinearPosition() {
if ( viewList != null && viewList.size() != 0) {
if ( mLinearPosition.getChildCount() != viewSize) {
int diffCnt = mLinearPosition.getChildCount() - viewSize ;
boolean needAdd = diffCnt < 0 ;
diffCnt = Math. abs( diffCnt) ;
for ( int i = 0 ; i < diffCnt ; i++) {
if ( needAdd) {
ImageView img = new ImageView(getContext()) ;
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams. WRAP_CONTENT , ViewGroup.LayoutParams. WRAP_CONTENT) ;
layoutParams. rightMargin = getResources().getDimensionPixelOffset(R.dimen. dimen_9dp) ;
img.setLayoutParams( layoutParams) ;
img.setBackgroundResource(R.drawable. banner_point) ;
mLinearPosition.addView( img) ;
} else {
mLinearPosition.removeViewAt( 0) ;
}
}
}
int curPos = mViewPager.getCurrentItem() ;
for ( int i = 0 ; i < mLinearPosition.getChildCount() ; i++) {
if ( i == ( curPos % viewSize)) {
mLinearPosition.getChildAt( i).setBackgroundResource(R.drawable. banner_point_select) ;
} else {
mLinearPosition.getChildAt( i).setBackgroundResource(R.drawable. banner_point) ;
}
}
}
}
public void setViewList(List<View> viewList) {
this. viewList = viewList ;
if (viewList != null && viewList.size() != 0) {
viewSize = viewList.size() ;
BannerAdapter bannerAdapter = new BannerAdapter(viewList) ;
setAdapter( bannerAdapter) ;
}
}
public void setTransformAnim ( boolean flag){
if (flag){
/**
* 假设现在 ViewPager 在 A 页现在滑出 B 页,则 :
A 页的 position 变化就是 ( 0, -1]
B 页的 position 变化就是 [ 1 , 0 ]
*/
mViewPager.setPageTransformer( true, new ViewPager.PageTransformer() {
private static final float MIN_SCALE = 0.75f ;
@Override
public void transformPage(View view , float position) {
int pageWidth = view.getWidth() ;
if (position < - 1)
{ // [-Infinity,-1)
// This page is way off-screen to the left.
view.setRotation( 0) ;
} else if (position <= 1) // a 页滑动至 b 页 ; a 页从 0.0 ~ -1 ; b 页从 1 ~ 0.0
{ // [-1,1]
// Modify the default slide transition to shrink the page as well
if (position < 0)
{
float mRot = ( 20f * position) ;
view.setPivotX(view.getMeasuredWidth() * 0.5f) ;
view.setPivotY(view.getMeasuredHeight()) ;
view.setRotation( mRot) ;
} else
{
float mRot = ( 20f * position) ;
view.setPivotX(view.getMeasuredWidth() * 0.5f) ;
view.setPivotY(view.getMeasuredHeight()) ;
view.setRotation( mRot) ;
}
// Scale the page down (between MIN_SCALE and 1)
// Fade the page relative to its size.
} else
{ // (1,+Infinity]
// This page is way off-screen to the right.
view.setRotation( 0) ;
}
}
}) ;
}
}
public static void setLoopInterval( long loopInterval) {
LOOP_INTERVAL = loopInterval ;
}
}
】
3、布局
【
<?
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 :layout_width= "match_parent"
android :layout_height= "match_parent"
android :orientation= "vertical"
tools :context= "com.blink.test.bannerview.MainActivity" >
<com.blink.test.bannerview.BannerView
android :layout_width= "match_parent"
android :layout_height= "220dp"
android :id= "@+id/banner" />
</LinearLayout>
<LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: tools = "http://schemas.android.com/tools"
android :layout_width= "match_parent"
android :layout_height= "match_parent"
android :orientation= "vertical"
tools :context= "com.blink.test.bannerview.MainActivity" >
<com.blink.test.bannerview.BannerView
android :layout_width= "match_parent"
android :layout_height= "220dp"
android :id= "@+id/banner" />
</LinearLayout>
】
4、实例展示
【
public class MainActivity
extends AppCompatActivity {
private int[] imgs = {R.drawable. a ,R.drawable. b ,R.drawable. c ,R.drawable. d} ;
private List<View> viewList ;
BannerView bannerView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState) ;
setContentView(R.layout. activity_main) ;
viewList = new ArrayList<View>() ;
for ( int i = 0 ; i < imgs. length ; i++) {
ImageView image = new ImageView( this) ;
image.setLayoutParams( new ViewGroup.LayoutParams(ViewGroup.LayoutParams. MATCH_PARENT , ViewGroup.LayoutParams. MATCH_PARENT)) ;
// 设置显示格式
image.setScaleType(ImageView.ScaleType. CENTER_CROP) ;
image.setImageResource( imgs[ i]) ;
viewList.add( image) ;
}
bannerView = (BannerView) findViewById(R.id. banner) ;
bannerView.setViewList( viewList) ;
bannerView.startLoop( true) ;
// bannerView.setTransformAnim(true);
}
}
private int[] imgs = {R.drawable. a ,R.drawable. b ,R.drawable. c ,R.drawable. d} ;
private List<View> viewList ;
BannerView bannerView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState) ;
setContentView(R.layout. activity_main) ;
viewList = new ArrayList<View>() ;
for ( int i = 0 ; i < imgs. length ; i++) {
ImageView image = new ImageView( this) ;
image.setLayoutParams( new ViewGroup.LayoutParams(ViewGroup.LayoutParams. MATCH_PARENT , ViewGroup.LayoutParams. MATCH_PARENT)) ;
// 设置显示格式
image.setScaleType(ImageView.ScaleType. CENTER_CROP) ;
image.setImageResource( imgs[ i]) ;
viewList.add( image) ;
}
bannerView = (BannerView) findViewById(R.id. banner) ;
bannerView.setViewList( viewList) ;
bannerView.startLoop( true) ;
// bannerView.setTransformAnim(true);
}
}
】