android 自定义轮播广告控件ViewPager——自定义控件学习(四)

来源:互联网 发布:网络流行语沙发的含义 编辑:程序博客网 时间:2024/04/29 02:23

android 自定义轮播广告控件ViewPager——自定义控件学习(四)

前面已经介绍过基于ViewFlipper的自定义控件了,现在要基于ViewPager制作一个图片轮播广告控件。如果想了解以前不是自定义方式的话,请看:android ViewPager轮播制作成品——轮播制作(六)。如果想看看基于ViewFlipper实现轮播广告控件和以看看这个:android 自定义ViewFlipper轮播广告控件——自定义控件学习(二)。
好啦,下面上货。
1、首先是主要的CustomerViewPagerComponent.java
package com.example.administrator.customerviewpagercomponent;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.view.Gravity;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import java.util.ArrayList;import java.util.List;/** * Created by Administrator on 2016-09-26. */public class CustomerViewPagerComponent extends RelativeLayout implements ViewPager.OnPageChangeListener {    private final int MAX_COUNT = 10000;    private final int TIME_INTERVAL = 5000;    public final int MSG_CODE = 0x986;    private int[] imgs;    private ImageView[] imageViews;    private ViewPager viewPager;    private LinearLayout linearLayout;    private List<View> dots;    private boolean autoPlayFlag;    private int currentNumber;    public void setImgs(int[] imgs) {        this.imgs = imgs;        if (imgs != null) {            imageViews = new ImageView[imgs.length];            for (int i = 0; i < imgs.length; i++) {                imageViews[i] = new ImageView(getContext());                imageViews[i].setImageResource(imgs[i]);                imageViews[i].setScaleType(ImageView.ScaleType.FIT_XY);            }            // 设置适配器            viewPager.setAdapter(new MyAdapter());            //设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动            currentNumber = (imageViews.length) * 100;            viewPager.setCurrentItem(currentNumber);            //设置监听器            viewPager.setOnPageChangeListener(this);            //开始自动播放            Message message = handler.obtainMessage(MSG_CODE);            handler.sendMessageDelayed(message, TIME_INTERVAL);            //设置点点            setDot(currentNumber);        }    }    //构造    public CustomerViewPagerComponent(Context context, AttributeSet attrs) {        super(context, attrs);        viewPager = new ViewPager(getContext());        viewPager.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));        addView(viewPager);        autoPlayFlag = true;    }    //设置ViewPager的适配器    public class MyAdapter extends PagerAdapter {        @Override        public int getCount() {            return MAX_COUNT;        }        @Override        public boolean isViewFromObject(View view, Object object) {            return view == object;        }        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            container.removeView(imageViews[position % imageViews.length]);        }        @Override        public Object instantiateItem(ViewGroup container, int position) {            container.addView(imageViews[position % imageViews.length], 0);            return imageViews[position % imageViews.length];        }    }    public Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            if (msg.what == MSG_CODE) {                if (autoPlayFlag) {                    showNext();                }                Message message = handler.obtainMessage(MSG_CODE);                handler.sendMessageDelayed(message, TIME_INTERVAL);            }        }    };    public void showNext() {        currentNumber++;        viewPager.setCurrentItem(currentNumber);        //设置点点        setDot(currentNumber);    }    public void showPrevious() {        currentNumber--;        viewPager.setCurrentItem(currentNumber);        //设置点点        setDot(currentNumber);    }    @Override    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {    }    @Override    public void onPageSelected(int position) {        currentNumber = position;        //设置点点        setDot(currentNumber);    }    @Override    public void onPageScrollStateChanged(int state) {        switch (state) {            case ViewPager.SCROLL_STATE_IDLE:                //无动作、初始状态                Log.i("---->",ViewPager.SCROLL_STATE_IDLE +"  SCROLL_STATE_IDLE");                break;            case ViewPager.SCROLL_STATE_DRAGGING:                //点击、滑屏                Log.i("---->",ViewPager.SCROLL_STATE_DRAGGING +"  SCROLL_STATE_DRAGGING");                autoPlayFlag = false;                break;            case ViewPager.SCROLL_STATE_SETTLING:                //释放                Log.i("---->",ViewPager.SCROLL_STATE_SETTLING +"  SCROLL_STATE_SETTLING");                autoPlayFlag = true;                break;        }    }    //设置当前选中的点点    private void setDot(int currentNumber) {        //remove        removeView(linearLayout);        //设置点点        linearLayout = new LinearLayout(getContext());        RelativeLayout.LayoutParams reLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);        reLayoutParams.setMargins(0, 0, 0, 30);        reLayoutParams.addRule(ALIGN_PARENT_BOTTOM);        linearLayout.setLayoutParams(reLayoutParams);        linearLayout.setOrientation(LinearLayout.HORIZONTAL);        linearLayout.setGravity(Gravity.RIGHT);        addView(linearLayout);        dots = new ArrayList<View>();        //设置当前选中        int current = currentNumber % imgs.length;        for (int i = 0; i < imgs.length; i++) {            View view = new View(getContext());            if (current == i) {                view.setBackgroundResource(R.drawable.dot_focused);            } else {                view.setBackgroundResource(R.drawable.dot_normal);            }            LinearLayout.LayoutParams layoutparams = new LinearLayout.LayoutParams(30, 30);            layoutparams.setMargins(5, 0, 5, 0);            view.setLayoutParams(layoutparams);            linearLayout.addView(view);        }    }}

2、需要的资源:

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

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

3、调用,在布局文件中添加:
<?xml version="1.0" encoding="utf-8"?><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.customerviewpagercomponent.MainActivity">    <com.example.administrator.customerviewpagercomponent.CustomerViewPagerComponent        android:layout_width="match_parent"        android:id="@+id/customerViewPager"        android:layout_marginTop="10dp"        android:layout_height="200dp"></com.example.administrator.customerviewpagercomponent.CustomerViewPagerComponent></RelativeLayout>

4、在MainActivity.java中设置:
package com.example.administrator.customerviewpagercomponent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    private CustomerViewPagerComponent customerViewPagerComponent;    private int[] imgs = new int[]{            R.drawable.img1,            R.drawable.img2,            R.drawable.img3,            R.drawable.img4    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        customerViewPagerComponent = (CustomerViewPagerComponent)this.findViewById(R.id.customerViewPager);        customerViewPagerComponent.setImgs(imgs);    }    @Override    protected void onDestroy() {        customerViewPagerComponent.handler.removeMessages(customerViewPagerComponent.MSG_CODE);        super.onDestroy();    }}

注意:在MainActivity.java中一定要在onDestroy把message释放,否则再次打开程序会出现程序闪退的问题,详细请看android ViewPager自动播放OOM处理——轮播制作(五)
运行结果:


最后附上代码:点我下载,不要你的积分哦!!!


0 0