- 要实现自动轮播的ViewPager 要先写一个类 来继承ViewPager
-
package com.testcyclepager; import android.content.Context; import android.os.Handler; import android.os.Message; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.Toast; import com.nineoldandroids.view.ViewHelper; import java.util.HashMap; import java.util.LinkedHashMap; /** * Created by SFS on 2017/2/26. */ public class CycleViewPager extends ViewPager { private float mTrans; private float mScale; /** * 最大的缩小比例 */ private static final float SCALE_MAX = 0.5f; /** * 保存position与对于的View */ private HashMap<Integer, View> mChildrenViews = new LinkedHashMap<Integer, View>(); /** * 滑动时左边的元素 */ private View mLeft; /** * 滑动时右边的元素 */ private View mRight; public CycleViewPager(Context context) { super(context); } public CycleViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void addOnPageChangeListener(OnPageChangeListener listener) { innerOnPageChangeListener onPageChangeListener=new innerOnPageChangeListener(listener); super.addOnPageChangeListener(onPageChangeListener); } @Override public void setAdapter(PagerAdapter adapter) { innerPagerAdapter innerPagerAdapter = new innerPagerAdapter(adapter); super.setAdapter(innerPagerAdapter); addOnPageChangeListener(null); //设置默认显示页面 setCurrentItem(1); //开始轮播 startScroll(); } /** * 内部监听 */ class innerOnPageChangeListener implements OnPageChangeListener{ private int position; private OnPageChangeListener listener; public innerOnPageChangeListener(OnPageChangeListener listener) { this.listener = listener; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (listener != null) { listener.onPageScrolled(position,positionOffset,positionOffsetPixels); } // //滑动特别小的距离时,我们认为没有动,可有可无的判断 // float effectOffset = isSmall(positionOffset) ? 0 : positionOffset; // // //获取左边的View // mLeft = findViewFromObject(position); // //获取右边的View // mRight = findViewFromObject(position + 1); // // // 添加切换动画效果 // animateStack(mLeft, mRight, effectOffset, positionOffsetPixels); } @Override public void onPageSelected(int position) { this.position = position; if (listener != null) { listener.onPageSelected(position); } } @Override public void onPageScrollStateChanged(int state) { //当前页面状态为空闲 if (state==ViewPager.SCROLL_STATE_IDLE) { if (position == 0) { setCurrentItem(getAdapter().getCount() - 2, false); } else if (position == getAdapter().getCount() - 1) { setCurrentItem(1, false); } } if (listener != null) { listener.onPageScrollStateChanged(state); } } public void setObjectForPosition(View view, int position) { mChildrenViews.put(position, view); } public View findViewFromObject(int position) { return mChildrenViews.get(position); } private boolean isSmall(float positionOffset) { return Math.abs(positionOffset) < 0.0001; } protected void animateStack(View left, View right, float effectOffset, int positionOffsetPixels) { if (right != null) { /** * 缩小比例 如果手指从右到左的滑动(切换到后一个):0.0~1.0,即从一半到最大 * 如果手指从左到右的滑动(切换到前一个):1.0~0,即从最大到一半 */ mScale = (1 - SCALE_MAX) * effectOffset + SCALE_MAX; /** * x偏移量: 如果手指从右到左的滑动(切换到后一个):0-720 如果手指从左到右的滑动(切换到前一个):720-0 */ mTrans = -getWidth() - getPageMargin() + positionOffsetPixels; ViewHelper.setScaleX(right, mScale); ViewHelper.setScaleY(right, mScale); ViewHelper.setTranslationX(right, mTrans); } if (left != null) { left.bringToFront(); } } } /** * 设置触摸滑动的监听 * @param ev * @return */ @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: stopScroll(); Toast.makeText(getContext(), "点击了屏幕", Toast.LENGTH_SHORT).show(); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: startScroll(); Toast.makeText(getContext(), "松开了屏幕", Toast.LENGTH_SHORT).show(); break; } return super.onTouchEvent(ev); } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); int currentItem = getCurrentItem(); currentItem++; setCurrentItem(currentItem); handler.sendEmptyMessageDelayed(1, 3000); } }; /** * 开始无限轮播 */ private void startScroll() { handler.sendEmptyMessageDelayed(1, 3000); } /** * 停止无限轮播 */ private void stopScroll() { handler.removeMessages(1); } /** * 修正PagerAdapter 适配器 */ class innerPagerAdapter extends PagerAdapter { private PagerAdapter adapter; public innerPagerAdapter(PagerAdapter adapter) { this.adapter = adapter; } /** * Return the number of views available. */ @Override public int getCount() { return adapter.getCount() + 2; } @Override public boolean isViewFromObject(View view, Object object) { return adapter.isViewFromObject(view, object); } @Override public Object instantiateItem(ViewGroup container, int position) { if (position == 0) { position = adapter.getCount() - 1; } else if (position == getCount() - 1) { position = 0; } else { position -= 1; } return adapter.instantiateItem(container, position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { adapter.destroyItem(container, position, object); } } }
- 在 MainActivity 中 进行ViewPager 的 初始化操作 main.xml 如下
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.testcyclepager.MainActivity"> <com.testcyclepager.CycleViewPager android:id="@+id/CycleViewPager" android:layout_width="match_parent" android:layout_height="match_parent"/> <LinearLayout android:gravity="center" android:layout_alignParentBottom="true" android:layout_marginBottom="50dp" android:id="@+id/LinearLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> </LinearLayout> </RelativeLayout>
- 在 MainActivity 中 进行初始化操作以及 监听
package com.testcyclepager; import android.os.Build; 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 { private CycleViewPager mViewPager; private CyclePagerAdapter adapter; private ImageView[] mPoints; private int[] Imgs = {R.drawable.one, R.drawable.two, R.drawable.three, R.drawable.four, R.drawable.five, R.drawable.six,R.mipmap.ic_launcher}; private LinearLayout mLayout; private ImageView mPoint; private LinearLayout.LayoutParams params; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager = (CycleViewPager) findViewById(R.id.CycleViewPager); mLayout = (LinearLayout) findViewById(R.id.LinearLayout); mPoints = new ImageView[Imgs.length]; // 添加 底部导航点 for (int i = 0; i < Imgs.length; i++) { mPoint = new ImageView(this); params = new LinearLayout.LayoutParams(20, 20); params.setMargins(10,0,15,0); mPoint.setLayoutParams(params); mPoints[i] = mPoint; if (i == 0) { // 默认选中第一张图片 mPoints[i].setBackgroundResource(R.drawable.shape_point_select); } else { mPoints[i].setBackgroundResource(R.drawable.shape_point_normal); } mLayout.addView(mPoint); } adapter = new CyclePagerAdapter(); mViewPager.setAdapter(adapter); mViewPager.addOnPageChangeListener(this); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { int item; if (position == 0) { position = adapter.getCount() - 1; } else if (position == adapter.getCount()+1) { position = 0; } else { position -= 1; } item=position; for (int i = 0; i < Imgs.length; i++) { mPoints[item].setBackgroundResource(R.drawable.shape_point_select); if (item != i) { mPoints[i].setBackgroundResource(R.drawable.shape_point_normal); } } } @Override public void onPageScrollStateChanged(int state) { } class CyclePagerAdapter extends PagerAdapter { @Override public int getCount() { return Imgs.length; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView = new ImageView(MainActivity.this); imageView.setImageResource(Imgs[position]); container.addView(imageView); return imageView; } } /** * 用来进行沉浸式状态栏的设置 * * @param hasFocus */ @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus && Build.VERSION.SDK_INT >= 19) { View decorView = getWindow().getDecorView(); decorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } } }
- 最后再 画一个Shape来进行导航样式
Shape_point_select.xml<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <stroke android:width="1dip" android:color="#f00"/> <solid android:color="#f00" /> </shape>
- Shape_point_normal.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <stroke android:width="1dip" android:color="#0078DA"/> <solid android:color="#0078DA" /> </shape>
无限轮播的ViewPager+导航小圆点()
最新推荐文章于 2019-08-14 17:55:00 发布