ViewPager轮播效果

来源:互联网 发布:大闹天宫进阶数据 编辑:程序博客网 时间:2024/05/16 12:22

直接贴关键代码。

调用处的代码

indicatorLayout = (LinearLayout) findViewById(R.id.index_indicatorlayout);        /*indicatorLayout必须声明在viewpager之前*/        viewPager = new IndexViewPage(mContext,indicatorLayout);        ((RelativeLayout)findViewById(R.id.mRelativeLayout_advertise)).addView(viewPager);        indicatorLayout.bringToFront();

activity界面关于生命周期处的调用及xml文件布局

 <RelativeLayout        android:id="@+id/mRelativeLayout_advertise"        android:layout_width="fill_parent"        android:layout_height="300dp" >        <LinearLayout            android:id="@+id/index_indicatorlayout"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignParentBottom="true"            android:layout_centerHorizontal="true"            android:layout_marginBottom="10dp"            android:orientation="horizontal" >        </LinearLayout>    </RelativeLayout>
@Override    protected void onResume() {        // TODO Auto-generated method stub        viewPager.startCarousel();        super.onResume();    }    @Override    protected void onPause() {        // TODO Auto-generated method stub        viewPager.stopCarousel();        super.onPause();    }    private void setListeners() {        // TODO Auto-generated method stub        // viewpager设置触摸监听        viewPager.setOnTouchListener(new OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                // TODO Auto-generated method stub                if (viewPager.getAdapter().getCount()<=1) {                    return false;                }                    switch (event.getAction()) {                    case MotionEvent.ACTION_DOWN:                        viewPager.stopCarousel();                        break;                    case MotionEvent.ACTION_UP:                        viewPager.startCarousel();                    }                    return false;            }        });}

关键类IndexViewPage

import java.util.ArrayList;import java.util.List;import android.content.Context;import android.os.Handler;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.util.Log;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;/** * @author Lang K * 自定义ViewPager 实现轮播,无限滑动 */public class IndexViewPage extends ViewPager {    /**     * 数据源     */    private List<View> list;    /**     * 动态加载view     */    private LayoutInflater inflater;    /**     * 上下文     */    private Context context;    /**     * 定义静态变量,标识是否     */    private static boolean isDone = true;    /**     * 定义静态变量,是否启动轮播线程     */    private static boolean ISRUN = true;    /**     *当前viewpager显示的指针      */    private static int CURRECTPOSTION = 100;    /**     * 声明线程     */    private MyThread myThread;    /**     * 定义静态变量,是否处理轮播     */    private static boolean isDoing = true;    /**     * handler回调CODE     */    private static final int HANDLERCODE = 0X10;    /**     * handler发送延迟,以毫秒计     */    private static final int DELAEDTIME = 5000;    private LinearLayout indicatorLayout;    /**     * 小圆点宽高     */    private static final int DOTWIDTH = 10;    private static final int DOTHEIGHT = 10;    private static final int DOTMRAGIN = 10;    /**     * Viewpager适配器     */    MyAdapter adapter;    /**     * 构造方法     * @param context 上下文     */    public IndexViewPage(Context context,LinearLayout indicatorLayout) {        super(context);        this.context = context;        this.indicatorLayout = indicatorLayout;        initView();    }    /**     * 构造方法     * @param context   上下文     * @param attrs     在xml文件中定义的属性     */    public IndexViewPage(Context context, AttributeSet attrs) {        super(context, attrs);        this.context = context;        initView();    }    /**     * 初始化ViewPager     */    private void initView() {        // TODO Auto-generated method stub        inflater = LayoutInflater.from(context);        /* 模拟数据*/        ArrayList<View> lists = new ArrayList<View>();        View view1 = inflater.inflate(R.layout.index_title_view, null);        lists.add(view1);        View view2 = inflater.inflate(R.layout.index_title_view, null);        ((ImageView)view2.findViewById(R.id.index_title_image)).setImageResource(R.drawable.banner6);        lists.add(view2);        View view3 = inflater.inflate(R.layout.index_title_view, null);        ((ImageView)view3.findViewById(R.id.index_title_image)).setImageResource(R.drawable.banner5);        lists.add(view3);        adapter = new MyAdapter();        setAdapter(adapter);        setListViews(lists);        if (list.size()!=1) {            setOnPageChangeListener(new PageChangeListener());            initDots();            setCurrentItem(CURRECTPOSTION);        }else if(list.size()==1){//          this.addView(list.get(0));        }    }    /**     * 初始化小圆点     */    private void initDots() {        // TODO Auto-generated method stub        for(int i = 0 ;i<list.size();i++){            ImageView imageView = new ImageView(context);            imageView.setId(i);            imageView.setImageDrawable(getResources().getDrawable(R.drawable.circle_up_bg));            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(DOTWIDTH,DOTHEIGHT);            params.leftMargin = DOTMRAGIN;            params.rightMargin = DOTMRAGIN;            indicatorLayout.addView(imageView, params);        }    }    @Override    public void setOnTouchListener(OnTouchListener l) {        // TODO Auto-generated method stub        super.setOnTouchListener(l);    }    public List<View> getList() {        return list;    }    public void setList(List<View> list) {        this.list = list;    }    /**     * ViewPager发送改变监听     * @author LangK     *     */    private class PageChangeListener implements OnPageChangeListener{        @Override        public void onPageScrollStateChanged(int arg0) {            // TODO Auto-generated method stub        }        @Override        public void onPageScrolled(int arg0, float arg1, int arg2) {            // TODO Auto-generated method stub        }        @Override        public void onPageSelected(int arg0) {            // TODO Auto-generated method stub            CURRECTPOSTION = arg0;            int postion = arg0 % list.size();            setIndicator(postion);        }    }    /**     * 改变底部圆点指针的颜色     * @param postion 当前指针     */    private void setIndicator(int postion){            for(int i=0;i<list.size();i++){                if (i==postion) {                    ((ImageView)indicatorLayout.getChildAt(i)).setImageDrawable(getResources().getDrawable(R.drawable.circle_down_bg));                }else {                    ((ImageView)indicatorLayout.getChildAt(i)).setImageDrawable(getResources().getDrawable(R.drawable.circle_up_bg));                                   }            }    }    /**     * Viewpager适配器     * @author LangK     *     */    private class MyAdapter extends PagerAdapter{        @Override        public int getCount() {            // TODO Auto-generated method stub            if (list==null) {                return 0;            }            if (list.size()<=1) {                return 1;            }else if (list.size()==2) {                return 2;            }            return Integer.MAX_VALUE;        }        @Override        public boolean isViewFromObject(View arg0, Object arg1) {            // TODO Auto-generated method stub            return arg0==arg1;        }        @Override        public Object instantiateItem(ViewGroup container, int position) {            // TODO Auto-generated method stub             if (list.get(position % list.size()).getParent() != null) {                      ((ViewPager) list.get(position % list.size())                              .getParent()).removeView(list.get(position                              % list.size()));                  }                  ((ViewPager) container).addView(                        list.get(position % list.size()), 0);                  return list.get(position % list.size());        }        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            // TODO Auto-generated method stub        }    }    /**     * 主线程的回调函数     */    private Handler handler = new Handler(){        public void handleMessage(android.os.Message msg) {            if (msg.what==HANDLERCODE) {                if (isDoing) {                    isDone = true;                    CURRECTPOSTION++;                    Log.d("IndexViewPager", "ViewPager发生改变");                    if (list.size()>1) {                        setCurrentItem(CURRECTPOSTION);                                         }                }            }        }    };    /**     * 轮播线程     */    private class MyThread extends Thread{        @Override        public void run() {            // TODO Auto-generated method stub            while(ISRUN){                if (isDone) {                    isDone = false;                    handler.sendEmptyMessageDelayed(HANDLERCODE,DELAEDTIME);                }            }        }    }    /**     * 停止轮播     */    public void stopCarousel(){        ISRUN = false;        isDoing = false;        isDone = false;        if (handler!=null) {            handler.removeMessages(HANDLERCODE);        }    }    /**     * 开始轮播     */    public void startCarousel(){        ISRUN = true;        isDoing = true;        isDone = true;        if (myThread==null||!myThread.getState().equals(Thread.State.RUNNABLE)) {            myThread = null;            myThread = new MyThread();            myThread.start();        }    }    /**     * 拦截触摸事件     */    @Override    public boolean onInterceptTouchEvent(MotionEvent arg0) {        // TODO Auto-generated method stub        if (list.size()>1) {            return super.onInterceptTouchEvent(arg0);                   }else {            return false;        }    }    public void setListViews(List<View> list){        this.list = list;        adapter.notifyDataSetChanged();    }}

界面中用到的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" >    <RelativeLayout         android:layout_width="fill_parent"        android:layout_height="fill_parent"        >        <ImageView             android:layout_width="fill_parent"            android:layout_height="fill_parent"            android:scaleType="fitXY"            android:src="@drawable/activity_index_banner"            android:id="@+id/index_title_image"            />        <TextView             android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:paddingTop="8dp"            android:paddingBottom="8dp"            android:background="#88000000"            android:layout_alignParentBottom="true"            android:layout_marginBottom="15dp"            android:textColor="#fff"            android:gravity="center"            android:text=""            android:singleLine="true"            android:ellipsize="marquee"             android:focusable="true"             android:marqueeRepeatLimit="marquee_forever"             android:focusableInTouchMode="true"            android:scrollHorizontally="true"            android:visibility="gone"             />    </RelativeLayout></LinearLayout>
0 0
原创粉丝点击