前天有朋友问我说实现类似新闻轮播图片的效果该怎么实现?有什么框架比较好一点。我想这不用什么框架,自己写一个就可以实现吧!好了,废话不多说,先看一下实现的效果图,再上代码。 实现的效果图
activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:id="@+id/viewPager" android:layout_height="match_parent"/> <LinearLayout android:layout_width="wrap_content" android:orientation="horizontal" android:layout_alignParentBottom="true" android:id="@+id/circleLayout" android:gravity="center" android:paddingBottom="30dp" android:layout_centerHorizontal="true" android:layout_height="wrap_content"> </LinearLayout> </RelativeLayout> </RelativeLayout> ScrollPagerAdapter.java public class ScrollPagerAdapter extends PagerAdapter { private Context context; private int[] mIamgeId; private ImageView[] mImageViews; public ScrollPagerAdapter(Context context, int[] mIamgeId) { this.mIamgeId = mIamgeId; this.context = context; mImageViews = new ImageView[mIamgeId.length]; for (int i = 0; i < mIamgeId.length; i++) {//通过传进来的图片数量来确定给父布局添加多少个子布局ImageView来显示图片 mImageViews[i] = new ImageView(context); } } @Override public int getCount() { return Integer.MAX_VALUE;//这个值需要设置为这个,如果只是设置为mIamgeId.length,那么久无法实现循环滚动 } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public Object instantiateItem(ViewGroup container, int position) { position = (position) % mIamgeId.length; ImageView iv = new ImageView(context); iv.setScaleType(ImageView.ScaleType.FIT_XY); iv.setImageResource(mIamgeId[position]); container.addView(iv);//装载对应的ImageVIew return iv; } } MainActivity.java public class MainActivity extends Activity { private ViewPager mViewPager; private LinearLayout mCircleLayout;//存放滚动时小圆点的父布局 private int[] mImageId = new int[]{R.mipmap.one, R.mipmap.two, R.mipmap.three, R.mipmap.four};//存放图片id的数组 private ScrollPagerAdapter mScrollPagerAdapter;//ViewPager的适配器 private Context mContext; private int mPreviousEnabledPointPosition;//记录上一张显示图片的位置 private PersonalHandler mHandler; //消息处理器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; initView();//初始化view drawRadious();//给mCircleLayout布局绘制对应的圆点,通过图片的数量来绘制对应圆点的数目 startRunImage();//开始轮播条滚动 } //初始化View private void initView() { mViewPager = (ViewPager) findViewById(R.id.viewPager); mCircleLayout = (LinearLayout) findViewById(R.id.circleLayout); mScrollPagerAdapter = new ScrollPagerAdapter(mContext, mImageId); mViewPager.setAdapter(mScrollPagerAdapter); } //给mCircleLayout布局绘制对应的圆点,通过图片的数量来绘制对应圆点的数目 private void drawRadious() { //进行小圆点的绘制 mCircleLayout.removeAllViews(); View v; LinearLayout.LayoutParams params; int size = mImageId.length; for (int i = 0; i < size; i++) { v = new View(mContext); v.setBackgroundResource(R.drawable.scroll_point_bg); params = new LinearLayout.LayoutParams(15, 15); if (i != 0) { params.leftMargin = 10; } v.setLayoutParams(params); v.setEnabled(false); mCircleLayout.addView(v); } mPreviousEnabledPointPosition = 0; mCircleLayout.getChildAt(mPreviousEnabledPointPosition).setEnabled(true); mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { position = position % mImageId.length; mCircleLayout.getChildAt(mPreviousEnabledPointPosition).setEnabled(false); mCircleLayout.getChildAt(position).setEnabled(true); mPreviousEnabledPointPosition = position; } @Override public void onPageScrollStateChanged(int state) { } }); } //开始轮播条滚动 private void startRunImage() { if (mHandler == null) { mHandler = new PersonalHandler(); } else { // 把队列中的所有的消息和任务全部清除出队列 mHandler.removeCallbacksAndMessages(null); } // 延时3秒钟, 执行PersonalRunnable任务类中的run方法 mHandler.postDelayed(new PersonalRunnable(), 3000); } //消息处理器 private class PersonalHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // 当前是在主线程中, 把轮播图切换到下一页面 int currentItem = (mViewPager.getCurrentItem() + 1) % mImageId.length; mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1); // 递归: postDelayed -> PersonalRunnable.run -> sendEmptyMessage -> handleMessage mHandler.postDelayed(new PersonalRunnable(), 3000); } } private class PersonalRunnable implements Runnable { @Override public void run() { mHandler.sendEmptyMessage(0); } } }