自定義控件——輪播廣告條

1. 效果圖

在這裏插入圖片描述

2. 佈局文件
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

    <LinearLayout
        android:layout_alignBottom="@id/viewpager"
        android:layout_marginTop="50dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#5000"
        android:gravity="center"
        android:orientation="vertical">
        
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#fff"
            android:textSize="16dp"
            android:text="廣告條標題"/>

        <LinearLayout
            android:id="@+id/ll_point_group"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

        </LinearLayout>

    </LinearLayout>

</RelativeLayout>
3. 輪播控制邏輯
public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;
    private TextView mTv_title;
    private LinearLayout mLl_point_group;
    private int previousIndex = 0; //上一個圓點的索引

    private int[] imageIds = {R.mipmap.a, R.mipmap.b, R.mipmap.c, R.mipmap.d, R.mipmap.e}; //初始化圖片數據
    private int middleIndex = Integer.MAX_VALUE / 2 % imageIds.length;//viewpager中間顯示的索引
    private String[] descriptions = {"標題一,標題一,標題一", "標題二,標題二,標題二",
            "標題三,標題三,標題三", "標題四,標題四,標題四", "標題五,標題五,標題五"
    };//廣告的描述信息

    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:
                    mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);
                    mHandler.sendEmptyMessageDelayed(0, 2000);
                    break;
            }
        }
    };

    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
    }

    private void initData() {

        //初始化小圓點
        for (int i = 0; i < imageIds.length; i++) {
            //創建一個寬高都爲20像素的佈局參數,實際開發中這裏一般都會將像素轉化爲dp
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(20, 20);
            ImageView point = new ImageView(MainActivity.this);
            point.setImageResource(R.drawable.selector_point_bg);
            if (i != 0) {
                layoutParams.leftMargin = 20;//相當於layout_marginleft
                point.setEnabled(false);
            }
            point.setLayoutParams(layoutParams);
            mLl_point_group.addView(point);
        }

        //給ViewPager設置頁面切換監聽
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                //動態更新廣告條標題
                mTv_title.setText(descriptions[position % imageIds.length]);

                //先將上一個小圓點置爲未選中狀態
                mLl_point_group.getChildAt(previousIndex).setEnabled(false);
                previousIndex = position % imageIds.length;
                //將小圓點設置爲able狀態
                mLl_point_group.getChildAt(position % imageIds.length).setEnabled(true);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        //讓ViewPager永遠先顯示第一張圖片
        mViewPager.setCurrentItem(Integer.MAX_VALUE / 2 - middleIndex);//setCurrentItem方法調用的時候addOnPageChangeListener會執行

        //循環播放
        mHandler.sendEmptyMessageDelayed(0, 2000);

        //設置ViewPage的觸摸監聽
        mViewPager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        //停止輪播
                        mHandler.removeCallbacksAndMessages(null);
                        break;
                    case MotionEvent.ACTION_UP:
                        //繼續輪播
                        mHandler.sendEmptyMessageDelayed(0, 2000);
                        break;
                }
                return false;//false沒有消費當前的觸摸事件,會繼續發送給viewpager的源碼中的ontouchevent方法所以它滑動起來
            }
        });
    }

    private void initView() {
        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        mTv_title = (TextView) findViewById(R.id.tv_title);
        mLl_point_group = (LinearLayout) findViewById(R.id.ll_point_group);//小圓點的容器

        //給ViewPager設置適配器
        mViewPager.setAdapter(new MyAdapter(this, imageIds));
    }
}
4. ViewPager適配器
public class MyAdapter extends PagerAdapter {
    private Context mContext;
    private int[] mDatas;

    public MyAdapter(Context context, int[] datas) {
        mContext = context;
        mDatas = datas;
    }

    @Override
    public int getCount() {
        return Integer.MAX_VALUE;//讓ViewPager無限輪播
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        //初始化視圖
        ImageView imageView = new ImageView(mContext);
        int index = position % mDatas.length;//取模,防止數組越界異常
        imageView.setBackgroundResource(mDatas[index]);
        //添加到容器
        container.addView(imageView);
        //返回視圖
        return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }
}
5. 小圓點圖片
  1. 小白點

     <shape xmlns:android="http://schemas.android.com/apk/res/android"
         android:shape="oval">
         <solid android:color="#fff"/>
         <size android:height="5dp"
               android:width="5dp"/>
     </shape>
    
  2. 小紅點

     <shape xmlns:android="http://schemas.android.com/apk/res/android"
         android:shape="oval">
         <solid android:color="#f00"/>
         <size android:width="5dp"
             android:height="5dp"/>
     </shape>
    
6. 小圓點圖片選擇器
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true" android:drawable="@drawable/shape_point_selected"/>
    <item android:state_enabled="false" android:drawable="@drawable/shape_point_normal"/>
</selector>

**備註:**圖片選擇器和shape繪製的圖片都是放在res/drawable下面。

非常感謝您的耐心閱讀,希望我的文章對您有幫助。歡迎點評、轉發或分享給您的朋友或技術羣。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章