——轮播图的实现——

来源:互联网 发布:订票软件哪个好 编辑:程序博客网 时间:2024/04/26 06:15

本例参考http://blog.csdn.net/code_legend/article/details/54729636?ref=myread
一、实现的效果
本例的轮播图使用ViewPager实现
这里写图片描述

二、代码部分
1、activity_main.xml主活动布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.administrator.viewpagerlunbo.MainActivity" >    <android.support.v4.view.ViewPager        android:id="@+id/viewPager"        android:layout_width="match_parent"        android:layout_height="200dp" >    </android.support.v4.view.ViewPager>    <LinearLayout        android:layout_alignBottom="@id/viewPager"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="#77000000"        android:padding="8dp"        android:orientation="vertical" >        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center_horizontal"            android:textColor="#ffffff"            android:textSize="16sp"            android:singleLine="true"            android:ellipsize="end"            android:id="@+id/tv_intro"            android:text="我不是文本" />        <LinearLayout            android:layout_marginTop="3dp"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:id="@+id/dot_layout"            android:layout_gravity="center_horizontal"            android:orientation="horizontal" >        </LinearLayout>    </LinearLayout></RelativeLayout>

2、设置放置图片的布局 adapter_ad.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <ImageView android:layout_width="match_parent"        android:src="@drawable/a"        android:id="@+id/image"        android:scaleType="fitXY"        android:layout_height="match_parent"/></LinearLayout>

这里图片可以自己找

3、创建一个实体类 Ad.java

/** * 创建实体类,包含文本和点两个属性 */public class Ad {    private int iconResId;    private String intro;    public Ad(int iconResId, String intro) {        super();        this.iconResId = iconResId;        this.intro = intro;    }    public int getIconResId() {        return iconResId;    }    public void setIconResId(int iconResId) {        this.iconResId = iconResId;    }    public String getIntro() {        return intro;    }    public void setIntro(String intro) {        this.intro = intro;    }}

4、MainActivity.java

public class MainActivity extends Activity {    private ViewPager viewPager;    private TextView tv_intro;    private LinearLayout dot_layout;    private Handler handler;    private ArrayList<Ad> list = new ArrayList<Ad>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        handler = new Handler();        initView();  //初始化布局控件        initListener();   //为每一页设置监听和实现轮播        initData();  //初始化图片资源和文本资源,设置对应页的图片文本和点。    }    private void initView() {        setContentView(R.layout.activity_main);        viewPager = (ViewPager) findViewById(R.id.viewPager);        tv_intro = (TextView) findViewById(R.id.tv_intro);        dot_layout = (LinearLayout) findViewById(R.id.dot_layout);    }    private void initListener() {        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {            @Override            public void onPageSelected(int position) {                Log.e("Activity", "position: "+position);                updateIntroAndDot();            }            @Override            public void onPageScrolled(int position, float positionOffset,                                       int positionOffsetPixels) {            }            @Override            public void onPageScrollStateChanged(int state) {            }        });        HomeHeaderTask task = new HomeHeaderTask();        task.start();    }    private void initData() {        list.add(new Ad(R.drawable.a, "巩俐不低俗,我就不能低俗"));        list.add(new Ad(R.drawable.b, "朴树又回来了,再唱经典老歌引百万人同唱啊"));        list.add(new Ad(R.drawable.c, "揭秘北京电影如何升级"));        list.add(new Ad(R.drawable.d, "乐视网TV版大放送"));        list.add(new Ad(R.drawable.e, "热血屌丝的反杀"));        initDots();        viewPager.setAdapter(new MyPagerAdapter());        updateIntroAndDot();    }    /**     * 初始化dot——动态加载点     */    private void initDots(){        for (int i = 0; i < list.size(); i++) {            View view = new View(this);            LayoutParams params = new LayoutParams(8, 8);            if(i!=0){                params.leftMargin = 5;            }            view.setLayoutParams(params);            view.setBackgroundResource(R.drawable.selector_dot);            dot_layout.addView(view);        }    }    /**     * 更新文本和点     */    private void updateIntroAndDot(){        //使用一个整除取余是为了让图片轮播完后从头继续开始播放        int currentPage = viewPager.getCurrentItem()%list.size();        tv_intro.setText(list.get(currentPage).getIntro());        //将当夜对应的点置为白点        for (int i = 0; i < dot_layout.getChildCount(); i++) {            dot_layout.getChildAt(i).setEnabled(i==currentPage);        }    }    /**     * handler实现自动轮播     */    class HomeHeaderTask implements Runnable {        public void start() {            // 移除之前发送的所有消息, 避免消息重复            handler.removeCallbacksAndMessages(null);            handler.postDelayed(this, 3000);        }        @Override        public void run() {            int currentItem = viewPager.getCurrentItem();            currentItem++;            viewPager.setCurrentItem(currentItem);            // 继续发延时3秒消息, 实现内循环            handler.postDelayed(this, 3000);        }    }    /**     * 创建适配器,实现viewpager的装载     */    class MyPagerAdapter extends PagerAdapter{        /**         * 返回多少page         */        @Override        public int getCount() {            return 10000;        }        /**         * true: 表示不去创建,使用缓存  false:去重新创建         * view: 当前滑动的view         * object:将要进入的新创建的view,由instantiateItem方法创建         */        @Override        public boolean isViewFromObject(View view, Object object) {            return view==object;        }        /**         * 类似于BaseAdapger的getView方法         * 用了将数据设置给view         * 由于它最多就3个界面,不需要viewHolder         */        @Override        public Object instantiateItem(ViewGroup container, int position) {            View view = View.inflate(MainActivity.this, R.layout.adapter_ad, null);            ImageView imageView = (ImageView) view.findViewById(R.id.image);            Ad ad = list.get(position%list.size());            imageView.setImageResource(ad.getIconResId());            container.addView(view);//一定不能少,将view加入到viewPager中            return view;        }        /**         * 销毁page         * position: 当前需要消耗第几个page         * object:当前需要消耗的page         */        @Override        public void destroyItem(ViewGroup container, int position, Object object) {//          super.destroyItem(container, position, object);            container.removeView((View) object);        }    }}

5、在drawable目录下 创建三个xml文件,
dot_focus.xml

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">    <solid android:color="#ffffff"/></shape>

dot_unfocus.xml

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">    <solid android:color="#aa000000"/></shape>

selector_dot.xml

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" >    <item android:state_enabled="true" android:drawable="@drawable/dot_focus"></item>    <item android:drawable="@drawable/dot_unfocus"></item></selector>