Android应用之广告轮播view, 自动循环轮播

来源:互联网 发布:cf显示网络异常win7 编辑:程序博客网 时间:2024/05/23 14:04

1、效果图:

功能:自动轮播,循环轮播。

这里写图片描述

2、代码:

view源码:

CarouselViewPager.java

package exam.org.jsc.password.view;import android.content.Context;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.LinearLayout;import android.widget.RelativeLayout;import java.util.ArrayList;import java.util.List;import exam.org.jsc.password.R;/** * Created by jsc on 2016/11/8. */public class CarouselViewPager extends RelativeLayout{    private final String TAG = "CarouselViewPager";    private final int MESSAGE_ID = 0x10;    private ViewPager mViewPager;    private LinearLayout mIndicator;    private List<View> mItemViews = new ArrayList<>();    private List<View> mIndicatorViews = new ArrayList<>();    private int size = 0;    private boolean isCloned = false;    private CarouselPagerAdapter adapter;    private LinearLayout.LayoutParams params;    private boolean isAutoScrolling = false;    private int itemLayout;    public CarouselViewPager(Context context) {        this(context, null);    }    public CarouselViewPager(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public CarouselViewPager(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init(context);    }    private void init(Context context){        inflate(context, R.layout.carousel_view_pager, this);        mViewPager = (ViewPager) findViewById(R.id.view_pager);        mIndicator = (LinearLayout) findViewById(R.id.indicator);        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {            @Override            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {            }            @Override            public void onPageSelected(int position) {                selectedIndicator(isCloned ? (position % (size / 2)) : (position % size));            }            @Override            public void onPageScrollStateChanged(int state) {            }        });        int dp4 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics());        int dp8 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());        params = new LinearLayout.LayoutParams(0, 0);        params.setMargins(dp4, dp4, dp4, dp4);        params.width = dp8;        params.height = dp8;    }    public void setItemLayout(int itemLayout) {        this.itemLayout = itemLayout;    }    /**     *     * @param data     * @param isCloned data是否clone过。clone规则:例如[0, 1], clone之后应该是这样[0, 1, 0, 1]。     * @param selectedIndex 默认选中的item。     * @param onLoadItemViewListener 图片加载器。     * @param <T>     */    public <T>void setData(List<T> data, boolean isCloned, int selectedIndex, OnLoadItemViewListener<T> onLoadItemViewListener){        this.isCloned = isCloned;        //清空之前的记录        if (adapter != null)            adapter.setViews(new ArrayList<View>());        mIndicator.removeAllViews();        mItemViews.clear();        mIndicatorViews.clear();        if (data == null || data.size() == 0){            size = 0;            return;        }        if (itemLayout == 0)            throw new IllegalArgumentException("You must call method setItemLayout(int itemLayout) first.");        size = data.size();        if (size == 2 && !isCloned)            throw new IllegalArgumentException("You must clone the data.");        int indicatorLen = size;        if (isCloned)            indicatorLen = size / 2;        //indicator        for (int i = 0; i < indicatorLen; i++) {            View view = new View(getContext());            view.setBackgroundResource(R.drawable.indicator_selector);            view.setTag(i);            mIndicator.addView(view, i, params);            mIndicatorViews.add(view);        }        //item        for (int j = 0; j < size; j++) {            View itemView = LayoutInflater.from(getContext()).inflate(itemLayout, null);            T item = data.get(j);            itemView.setTag(item);            if (onLoadItemViewListener != null)                onLoadItemViewListener.onLoadItemView(itemView, item);            mItemViews.add(j, itemView);        }        adapter = new CarouselPagerAdapter(mItemViews);        mViewPager.setAdapter(adapter);        if (selectedIndex < 0)            selectedIndex = 0;        selectedIndicator(isCloned ? (selectedIndex % (size / 2)) : (selectedIndex % size));        mViewPager.setCurrentItem((100 / size * size + selectedIndex) % size);        stopAutoScroll();        startAutoScroll();    }    private void selectedIndicator(int selectedIndex){        for (int i = 0; i < mIndicatorViews.size(); i++) {            if (i == selectedIndex) mIndicatorViews.get(i).setSelected(true);            else mIndicatorViews.get(i).setSelected(false);        }    }    private void startAutoScroll(){        if (size <= 1)            return;        if (!isAutoScrolling){            mHandler.sendEmptyMessageDelayed(MESSAGE_ID, 3 * 1000);            isAutoScrolling = true;        }    }    private void stopAutoScroll(){        if (isAutoScrolling){            mHandler.removeMessages(MESSAGE_ID);            isAutoScrolling = false;        }    }    private Handler mHandler =  new Handler(){        @Override        public void handleMessage(Message msg) {            if (msg.what == 0x10){                int cur = mViewPager.getCurrentItem();                cur ++;                mViewPager.setCurrentItem(cur, true);                sendEmptyMessageDelayed(MESSAGE_ID, 3 * 1000);            }        }    };    @Override    protected void onDetachedFromWindow() {        super.onDetachedFromWindow();    }    public void onResume(){        startAutoScroll();    }    public void onPause(){        stopAutoScroll();    }    @Override    public boolean onTouchEvent(MotionEvent event) {        return super.onTouchEvent(event);    }    @Override    public boolean dispatchTouchEvent(MotionEvent event) {        Log.i(TAG, "onTouch-->event: " + event.getAction());        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:            case MotionEvent.ACTION_MOVE:                stopAutoScroll();                break;            case MotionEvent.ACTION_UP:            case MotionEvent.ACTION_CANCEL:                startAutoScroll();                break;        }        return super.dispatchTouchEvent(event);    }    public interface OnLoadItemViewListener<T>{        void onLoadItemView(View itemView, T item);    }    class CarouselPagerAdapter extends PagerAdapter {        List<View> views = new ArrayList<>();        int viewSize = 0;        public CarouselPagerAdapter(List<View> views) {            this.views = views;            viewSize = views.size();        }        public void setViews(List<View> views) {            this.views = views;            viewSize = views.size();            notifyDataSetChanged();        }        @Override        public int getCount() {            // TODO Auto-generated method stub            return viewSize <= 1 ? viewSize : Integer.MAX_VALUE;        }        @Override        public boolean isViewFromObject(View arg0, Object arg1) {            // TODO Auto-generated method stub            return arg0 == arg1;        }        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            if (viewSize <= 1)                return;            container.removeView(views.get(position % viewSize));        }        /**         * 载入图片进去,用当前的position 除以 图片数组长度取余数是关键         */        @Override        public Object instantiateItem(ViewGroup container, int position) {            int realPos = viewSize < 2 ? position : position % viewSize;            Log.i(TAG, "instantiateItem pos = " + realPos);            View view = views.get(realPos);            if (view.getParent() == null){                container.addView(view);            }            return view;        }    }}

carousel_view_pager.xml

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="120dp">    <android.support.v4.view.ViewPager        android:id="@+id/view_pager"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <LinearLayout        android:id="@+id/indicator"        android:orientation="horizontal"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="bottom|center_horizontal"        android:layout_marginBottom="@dimen/activity_vertical_margin"/></FrameLayout>

drawable文件夹

indicator_selector.xml

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:state_selected="true">        <shape android:shape="oval">            <solid android:color="#FF4081"/>        </shape>    </item>    <item >        <shape android:shape="oval">            <solid android:color="#FFFFFF"/>        </shape>    </item></selector>

3、使用:

界面调用

CarouselViewPagerActivity.java

package exam.org.jsc.password.activity;import android.graphics.Color;import android.os.Bundle;import android.view.View;import android.widget.TextView;import java.util.ArrayList;import java.util.List;import java.util.Random;import exam.org.jsc.password.R;import exam.org.jsc.password.view.CarouselViewPager;public class CarouselViewPagerActivity extends BaseActivity {    private CarouselViewPager mCarouselViewPager;    int[] colors = {            Color.BLACK,            Color.BLUE,            Color.YELLOW,            Color.GREEN,            Color.CYAN,            Color.RED    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_carousel_view_pager);        setStatusBarBackground();        initTitleBar("CarouselViewPager", new View.OnClickListener() {            @Override            public void onClick(View v) {                finish();            }        });        mCarouselViewPager = (CarouselViewPager) findViewById(R.id.carousel_view_pager);        mCarouselViewPager.setItemLayout(R.layout.carousel_item_layout);        List<MyModel> data = new ArrayList<>();        Random random = new Random();        for (int i = 0; i < 5; i++) {            MyModel myModel = new MyModel();            myModel.label = "position : " + i;            myModel.color = colors[random.nextInt(colors.length)];            data.add(myModel);        }        mCarouselViewPager.setData(data, false, 0, new CarouselViewPager.OnLoadItemViewListener<MyModel>() {            @Override            public void onLoadItemView(View itemView, MyModel item) {                View view = itemView.findViewById(R.id.iv_pic);                view.setBackgroundColor(item.color);            }        });    }    @Override    protected void onResume() {        super.onResume();        mCarouselViewPager.onResume();    }    @Override    protected void onPause() {        super.onPause();        mCarouselViewPager.onPause();    }    class MyModel {        String label;        int color;    }}

界面布局文件

activity_carousel_view_pager.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main2"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="exam.org.jsc.password.activity.AboutActivity">    <include layout="@layout/title_bar" />    <exam.org.jsc.password.view.CarouselViewPager        android:id="@+id/carousel_view_pager"        android:layout_width="match_parent"        android:layout_height="wrap_content"/></LinearLayout>

适配器itemView

carousel_item_layout.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="120dp">    <ImageView        android:id="@+id/iv_pic"        android:layout_width="match_parent"        android:layout_height="match_parent" /></RelativeLayout>

谢谢您的惠顾,code有不足的地方请在评论里回复(或者联系我)。
QQ1006368252

0 0