自定义轮播图

//第一步布局

《banner View 布局》
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="abner.vip.com.appview.MainActivity">
    <!--轮播图-->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="200dp">

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

        <!--添加指示点-->
        <LinearLayout
            android:id="@+id/layout_point"
            android:layout_width="wrap_content"
            android:layout_height="10dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:orientation="horizontal" />
    </RelativeLayout>

</RelativeLayout>


//BannerView.class

package bw.com.ljm.views;

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 java.util.List;

/**
 * author:AbnerMing
 * date:2019/3/19
 * 自定义轮播图
 */
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 = (LinearLayout) view.findViewById(R.id.layout_point);
        mViewPager = (ViewPager) 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);
            }
        }
    };


    //2.2轮播适配器
    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;
        }
    }
}

Activity

package abner.vip.com.appview.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.vip.com.appview.R;

import abner.vip.com.appview.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 = (BannerView) findViewById(R.id.banner);
        mBannerView.setIamgeArr(imageArr);
       // mBannerView.setTime(5000);
        // mBannerView.startBanner();//开启
        // mBannerView.stopBanner();//关闭
    }
}

<?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">


获取class

    <bw.com.ljm.views.BannerView
        android:id="@+id/banner"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        banner:time="1000"
        banner:start0rStop="false"
        />

</LinearLayout>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值