原文地址:https://github.com/hongyangAndroid/MagicViewPager/wikijava
單頁顯示3個Item的ViewPager炫酷切換效果,適用於Banner等。android
###(1)引入git
compile `com.zhy:magic-viewpager:1.0.1`
###(2)示例github
<FrameLayout android:layout_width="match_parent" android:layout_height="160dp" android:clipChildren="false" android:layout_centerInParent="true" android:background="#aadc71ff" > <android.support.v4.view.ViewPager android:id="@+id/id_viewpager" android:layout_width="match_parent" android:layout_marginLeft="60dp" android:clipChildren="false" android:layout_marginRight="60dp" android:layout_height="120dp" android:layout_gravity="center" > </android.support.v4.view.ViewPager> </FrameLayout>
注意外層android:layout_centerInParent="true"
.(貌似其實沒什麼影響)app
mViewPager.setPageMargin(20);//設置page間間距,自行根據需求設置
mViewPager.setOffscreenPageLimit(3);//>=3
mViewPager.setAdapter...//寫法不變 //setPageTransformer 決定動畫效果
mViewPager.setPageTransformer(true, new RotateDownPageTransformer());
##目前可選動畫ide
動畫間能夠自由組合,例如:佈局
mViewPager.setPageTransformer(true,new RotateDownPageTransformer(new AlphaPageTransformer(new ScaleInTransformer())));
需求:post
1.一個頁面顯示三個item動畫
2.viewpager無限循環this
3.定時滑動
4.長條形小點
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#aadc71ff" android:clipChildren="false" tools:context="com.example.administrator.banner2.MainActivity">
<android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="150dp" android:layout_gravity="center" android:layout_marginBottom="10dp" android:layout_marginLeft="30dp" android:layout_marginRight="30dp" android:layout_marginTop="10dp" android:clipChildren="false"></android.support.v4.view.ViewPager>
<LinearLayout android:id="@+id/dotLayout" android:layout_width="match_parent" android:layout_height="10dp" android:layout_gravity="bottom" android:layout_marginBottom="10dp" android:gravity="center" android:orientation="horizontal"></LinearLayout>
</FrameLayout>
import android.os.Bundle; import android.os.Handler; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import com.zhy.magicviewpager.transformer.ScaleInTransformer; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity { private ViewPager mViewPager; private PagerAdapter mAdapter; private LinearLayout dotLayout; private Timer timer; private Handler mHandler = new Handler(); private int prePosition = 0; int[] imgRes = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e, R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.i}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager = (ViewPager) findViewById(R.id.viewpager); dotLayout = (LinearLayout) findViewById(R.id.dotLayout); initDots(); mViewPager.setPageMargin(20); mViewPager.setOffscreenPageLimit(3); mViewPager.setAdapter(mAdapter = new PagerAdapter() { @Override public Object instantiateItem(ViewGroup container, int position) { ImageView view = new ImageView(MainActivity.this); view.setScaleType(ImageView.ScaleType.FIT_XY); view.setImageResource(imgRes[position % imgRes.length]); container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object o) { return view == o; } }); mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { dotLayout.getChildAt(prePosition).setEnabled(false); dotLayout.getChildAt(position % imgRes.length).setEnabled(true); prePosition = position % imgRes.length; } @Override public void onPageScrollStateChanged(int state) { } }); mViewPager.setPageTransformer(true, new ScaleInTransformer()); if (null != timer) { timer.cancel(); } timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { mHandler.post(new Runnable() { @Override public void run() { mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1); } }); } }, 0, 1000); } private void initDots() { if (null != dotLayout) { dotLayout.removeAllViews(); } for (int i = 0; i < imgRes.length; i++) { ImageView dot = new ImageView(this); dot.setEnabled(false); dot.setImageResource(R.drawable.dot); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); params.leftMargin = 10; dot.setLayoutParams(params); dotLayout.addView(dot); } dotLayout.getChildAt(0).setEnabled(true); } }
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true">
<shape android:shape="rectangle">
<size android:width="15dp" android:height="3dp"></size>
<corners android:radius="10dp" />
<solid android:color="#ff0000" />
</shape>
</item>
<item android:state_enabled="false">
<shape android:shape="rectangle">
<size android:width="15dp" android:height="3dp"></size>
<corners android:radius="10dp" />
<solid android:color="#ffffff" />
</shape>
</item>
</selector>