电商_自定义轮播图

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:banner="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.example.myapplication.view.ActionBarView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <com.example.myapplication.view.BannerView
        android:id="@+id/banner"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        banner:time="1000"
        banner:start0rStop="false"
        />

</LinearLayout>

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="BannerViewStyle">
        <attr name="time" format="integer"/>
        <attr name="start0rStop" format="boolean"/>
    </declare-styleable>

</resources>

Activity

package com.example.myapplication.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.example.myapplication.R;
import com.example.myapplication.view.BannerView;


//自定义轮播图
public class BannerActivity extends AppCompatActivity {
    private String[] imageArr = {
            "https://img.huxiucdn.com/article/cover/201903/19/103309148638.jpg",
            "https://img.huxiucdn.com/article/cover/201903/19/093023895789.jpg",
            "https://img.huxiucdn.com/article/cover/201903/19/073127446748.jpg"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_banner);
        BannerView mBannerView = findViewById(R.id.banner);
        mBannerView.setIamgeArr(imageArr);
       // mBannerView.setTime(3000);
        //mBannerView.startBanner();//开启
        //mBannerView.stopBanner();//关闭
    }
}

自定义View

package com.example.myapplication.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.bumptech.glide.Glide;
import com.example.myapplication.R;

import java.util.List;


public class BannerView extends RelativeLayout {
    private boolean start0rStop;
    private String[] imageArr = null;
    private Context context;
    private LinearLayout layoutPoint;
    private ViewPager mViewPager;
    private BannerAdapter mBannerAdapter;

    private long bannerTime = 3000;//轮询时间

    public BannerView(Context context) {
        super(context);
        init(context);
    }

    public BannerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BannerViewStyle);
        int time = typedArray.getInteger(R.styleable.BannerViewStyle_time, 3000);
        start0rStop = typedArray.getBoolean(R.styleable.BannerViewStyle_start0rStop, true);
        setTime(Long.parseLong(time + ""));//设置时间
        typedArray.recycle();//释放
        init(context);
    }

    public BannerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    //设置数据,以数组的方式
    public void setIamgeArr(String[] imageArr) {
        this.imageArr = imageArr;
        setPoint(0);
        mBannerAdapter.notifyDataSetChanged();
    }

    //设置数据,以集合的方式
    public void setImageList(List<String> image) {
        imageArr = new String[image.size()];
        for (int a = 0; a < image.size(); a++) {
            imageArr[a] = image.get(a);
        }
        setPoint(0);
        mBannerAdapter.notifyDataSetChanged();
    }

    //开启轮播
    public void startBanner() {
        handler.sendEmptyMessage(1000);
    }

    //停止轮播
    public void stopBanner() {
        handler.removeMessages(1000);
    }

    //传递轮询时间
    public void setTime(long bannerTime) {
        this.bannerTime = bannerTime;
    }


    //初始化
    private void init(Context context) {
        this.context = context;
        View view = View.inflate(context, R.layout.banner_view, null);
        layoutPoint = view.findViewById(R.id.layout_point);
        mViewPager = view.findViewById(R.id.viewpager);

        mBannerAdapter = new BannerAdapter();
        mViewPager.setAdapter(mBannerAdapter);

        mViewPager.setCurrentItem(Integer.MAX_VALUE / 2);

        if (start0rStop) {
            startBanner();
        } else {
            stopBanner();
        }
        // handler.sendEmptyMessageDelayed(1000, bannerTime);


        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }

            @Override
            public void onPageSelected(int i) {
                setPoint(i % imageArr.length);
            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });

        addView(view);
    }

    //添加指示点
    public void setPoint(int position) {
        if (imageArr == null) {
            return;
        }
        layoutPoint.removeAllViews();
        for (int a = 0; a < imageArr.length; a++) {
            ImageView imageView = new ImageView(context);
            if (position == a) {
                imageView.setBackgroundResource(R.drawable.point_yes);
            } else {
                imageView.setBackgroundResource(R.drawable.point_no);
            }
            layoutPoint.addView(imageView);//把指示点添加到layout里
            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) imageView.getLayoutParams();
            params.rightMargin = 10;
            imageView.setLayoutParams(params);
        }

    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1000) {
                int item = mViewPager.getCurrentItem();
                item++;
                mViewPager.setCurrentItem(item);
                handler.sendEmptyMessageDelayed(1000, bannerTime);
            }
        }
    };


    private class BannerAdapter extends PagerAdapter {

        @Override
        public int getCount() {
            if (imageArr == null) {
                return 0;
            }
            return Integer.MAX_VALUE;//imageArr.length;
        }

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

        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            //super.destroyItem(container, position, object);
            container.removeView((View) object);
        }

        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            ImageView imageView = new ImageView(context);
            Glide.with(context).load(imageArr[position % imageArr.length]).into(imageView);
            container.addView(imageView);
            return imageView;
        }
    }
}

效果图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43797842/article/details/88707862
今日推荐