前天有朋友问我说实现类似新闻轮播图片的效果该怎么实现?有什么框架比较好一点。我想这不用什么框架,自己写一个就可以实现吧!好了,废话不多说,先看一下实现的效果图,再上代码。
实现的效果图
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);
}
}
}