android 大图伦滚

来源:互联网 发布:js添加input隐藏属性 编辑:程序博客网 时间:2024/04/28 14:25

一个循环滚动的新闻条在android开发中很常见。
1 . 先看效果
这里写图片描述
上面是一组图片组成的新闻循环播放,下面是对应的文字说明,圆圈选择的表示当前页面,
实现的效果:
(1)图片滚动,文字也相应的滚动,圆圈也变,
(2)每隔5秒钟,新闻自动滚动
(3)支持第一个可以往后滑动,最后一个可以往前滑动
(4)左右滑动

2. 布局文件的分析
2.1最上面是一个ViewPager

    <android.support.v4.view.ViewPager        android:id="@+id/viewPager"        android:layout_width="match_parent"        android:layout_height="200dp" >    </android.support.v4.view.ViewPager>

2.2 下面是一个垂直方向的线性布局,一个文本显示和一个水平方向的线性布局,外层的线性布局添加一个背景色(灰色半透明的,argb),它的内边距属性padding为8dp。
文本的布局:水平居中,设置字体的颜色,大小,单行显示,超出部分字段使用…,
水平方向的线性布局:距离上面的一点空间,水平居中,方向。

 <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" >        <!-- ellipsize超出的文本末尾显示... -->        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center_horizontal"            android:textColor="#ffffff"            android:textSize="16sp"            android:id="@+id/text"            android:singleLine="true"            android:ellipsize="end"            android:text="我是文本" />        <LinearLayout            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:id="@+id/dot_layout"            android:layout_marginTop="3dp"            android:layout_gravity="center_horizontal"            android:orientation="horizontal" >        </LinearLayout>    </LinearLayout>

3.代码的分析
3.1 广告的实体类

public class Ad {    private int iconResId;    private String intro;    //省略get/set    快捷键ctrl+shift+s 之后点击r(原因是Generate Getter and Setter 小r下面有横线,下面有横线的表示是快捷键)

3.2 初始化界面,初始化数据,初始化点,初始化监听器。
重点是滑动页面的监听器。

public class MainActivity extends Activity {    private ViewPager viewPager;    private TextView text;    private LinearLayout dot_layout;    private ArrayList<Ad> list = new ArrayList<Ad>();    private Handler handler = new Handler(){        public void handleMessage(android.os.Message msg) {            //下一页            viewPager.setCurrentItem(viewPager.getCurrentItem()+1);            //循环发送            handler.sendEmptyMessageDelayed(0, 5000);        };    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        initView();        initListener();        initData();    }    private void initView() {        setContentView(R.layout.activity_main);        viewPager = (ViewPager) findViewById(R.id.viewPager);        text = (TextView) findViewById(R.id.text);        dot_layout = (LinearLayout) findViewById(R.id.dot_layout);    }    private void initListener() {        //滑动页面的监听        viewPager.setOnPageChangeListener(new OnPageChangeListener() {            /**             * 第一次不会执行此方法。             */            @Override            public void onPageSelected(int position) {                updateIntroAndDot();            }            @Override            public void onPageScrolled(int position, float positionOffset,                    int positionOffsetPixels) {            }            @Override            public void onPageScrollStateChanged(int state) {            }        });    }    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());        //默认选择中间的数据        int centerValue = Integer.MAX_VALUE/2;        int value = centerValue%list.size();        //选中第0个        viewPager.setCurrentItem(centerValue - value);        updateIntroAndDot();//在这个地方加入的原因,第一次加载的图片是位置0,在方法onPageSelected里面是加载不到的,        handler.sendEmptyMessageDelayed(0, 5000);    }    //初始化点    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();        text.setText(list.get(currentPage).getIntro());        for (int i = 0; i < dot_layout.getChildCount(); i++) {            dot_layout.getChildAt(i).setEnabled(i==currentPage);        }    }    class MyPagerAdapter extends PagerAdapter {        @Override        public int getCount() {            return Integer.MAX_VALUE;        }        /**         * true:表示不去创建,使用缓存,false:去重新创建 当前滑动的是否和将要进人的是同一个view         */        @Override        public boolean isViewFromObject(View view, Object object) {            return view == object;        }        /**         * 类似于baseAdapter的getView方法 将数据设置给view的 由于它最多3个页面,不需要viewholder         */        @Override        public Object instantiateItem(ViewGroup container, int position) {            View view = View.inflate(MainActivity.this, R.layout.adapter_ad,                    null);            ImageView image = (ImageView) view.findViewById(R.id.image);            Ad ad = list.get(position%list.size());             /**3:3             * 4:4             * 5:0  第5页 第一页             * 6:1             * 7:2             * 8:3             */            image.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) {            // 这个方法必须注释掉,源码里面是直接UnsupportedOperationException("Required method destroyItem was not overridden");            // super.destroyItem(container, position, object);            container.removeView((View) object);        }    }}

源码位置:http://download.csdn.net/detail/dczjzz/9089463

0 0
原创粉丝点击