Android自定义轮播控件
时间: 2023-10-04 18:14:04 浏览: 58
Android自定义轮播控件可以使用ViewPager和Handler实现:
1. 首先创建一个自定义的ViewPager类,并重写onTouchEvent()方法,实现手势滑动效果。
```
public class MyViewPager extends ViewPager {
private float startX;
private float startY;
private OnItemClickListener onItemClickListener;
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = ev.getX();
startY = ev.getY();
break;
case MotionEvent.ACTION_UP:
float endX = ev.getX();
float endY = ev.getY();
if (startX == endX && startY == endY) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(getCurrentItem());
}
}
break;
}
return super.onTouchEvent(ev);
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public interface OnItemClickListener {
void onItemClick(int position);
}
}
```
2. 创建一个自定义的轮播控件类,继承自LinearLayout,并在该类中初始化ViewPager和指示器,并设置自动轮播。
```
public class MyBanner extends LinearLayout {
private Context mContext;
private MyViewPager mViewPager;
private LinearLayout mIndicatorLayout;
private List<ImageView> mIndicatorViews;
private List<String> mImageUrls;
private int mCurrentItem = 0;
private Handler mHandler = new Handler();
public MyBanner(Context context) {
super(context);
initView(context);
}
public MyBanner(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
private void initView(Context context) {
mContext = context;
View view = LayoutInflater.from(mContext).inflate(R.layout.my_banner_layout, this);
mViewPager = (MyViewPager) view.findViewById(R.id.viewpager);
mIndicatorLayout = (LinearLayout) view.findViewById(R.id.indicator_layout);
}
public void setImageUrls(List<String> imageUrls) {
mImageUrls = imageUrls;
initIndicator();
mViewPager.setAdapter(new MyBannerAdapter());
mViewPager.setCurrentItem(Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2 % mImageUrls.size()));
startAutoScroll();
}
private void initIndicator() {
mIndicatorViews = new ArrayList<>();
for (int i = 0; i < mImageUrls.size(); i++) {
ImageView indicatorView = new ImageView(mContext);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.rightMargin = 20;
indicatorView.setLayoutParams(params);
if (i == 0) {
indicatorView.setImageResource(R.drawable.indicator_selected);
} else {
indicatorView.setImageResource(R.drawable.indicator_normal);
}
mIndicatorLayout.addView(indicatorView);
mIndicatorViews.add(indicatorView);
}
}
private void startAutoScroll() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);
mHandler.postDelayed(this, 2000);
}
}, 2000);
}
private class MyBannerAdapter extends PagerAdapter {
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public Object instantiateItem(ViewGroup container, final int position) {
ImageView imageView = new ImageView(mContext);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
Glide.with(mContext).load(mImageUrls.get(position % mImageUrls.size())).into(imageView);
container.addView(imageView);
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "点击了第" + (position % mImageUrls.size() + 1) + "张图片", Toast.LENGTH_SHORT).show();
}
});
return imageView;
}
}
}
```
3. 在布局文件中使用自定义的轮播控件。
```
<com.example.myapplication.MyBanner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="200dp" />
```
4. 在代码中设置轮播的图片地址。
```
List<String> imageUrls = new ArrayList<>();
imageUrls.add("http://img2.imgtn.bdimg.com/it/u=202085641,1798154443&fm=27&gp=0.jpg");
imageUrls.add("http://img5.imgtn.bdimg.com/it/u=2746360890,4221331673&fm=27&gp=0.jpg");
imageUrls.add("http://img0.imgtn.bdimg.com/it/u=3054917406,3471798182&fm=27&gp=0.jpg");
mBanner.setImageUrls(imageUrls);
```