电商_自定义轮播图
布局
<?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;
}
}
}
效果图