android防新闻循环轮播图效果

来源:互联网 发布:互联网企业 知乎 编辑:程序博客网 时间:2024/06/18 04:22

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

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.javapublic 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.javapublic 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);        }    }}
1 0
原创粉丝点击