public class CarouselView extends FrameLayout implements ViewPager.OnPageChangeListener {
private Context context;
private int totalCount =100;//总数,这是为实现无限滑动设置的
private int showCount;//要显示的轮播图数量
private int currentPosition =0;//当前ViewPager的位置
private ViewPager viewPager;
private LinearLayout carouselLayout;//展示指示器的布局
private Adapter adapter;
private int pageItemWidth;//每个指示器的宽度
private boolean isUserTouched = false;
public CarouselView(Context context) {
super(context);
this.context = context;
}
public CarouselView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public CarouselView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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/gallery"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:unselectedAlpha="1">
</android.support.v4.view.ViewPager>
<LinearLayout android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal"
android:gravity="center"
android:layout_gravity="center|bottom"
android:id="@+id/CarouselLayoutPage"
android:padding="10dip">
</LinearLayout>
</FrameLayout>
@Override
protected void onFinishInflate() {
super.onFinishInflate();
View view = LayoutInflater.from(context).inflate(R.layout.carousel_layout,null);
this.viewPager = (ViewPager) view.findViewById(R.id.gallery);
this.carouselLayout = (LinearLayout)view.findViewById(R.id.CarouselLayoutPage);
pageItemWidth = ConvertUtils.dip2px(context,5);
this.viewPager.addOnPageChangeListener(this);
addView(view);
}
//定义一个接口让外部设置展示的View
public interface Adapter{
boolean isEmpty();
View getView(int position);
int getCount();
}
//ViewPager的适配器
class ViewPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return totalCount;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
@Override
public Object isViewFromObject(ViewGroup container, int position) {
position %= showCount;
//调用接口的getView()获取使用者要展示的View;
View view = adapter.getView(position);
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
@Override
public void finishUpdate(ViewGroup container) {
super.finishUpdate(container);
int position = viewPager.getCurrentItem();
//实现Viewpager到第一页的实现能向左滑动
if (position==0){
position=showCount;
viewPager.setCurrentItem(position,false);
}else if (position==totalCount-1){//ViewPager到最后一页的实现向又滑动
position = showCount - 1;
viewPager.setCurrentItem(position,false);
}
}
}
//为外部提供设置数据源的方法,同时为ViewPager做展示
public void setAdapter(Adapter adapter){
this.adapter = adapter;
if (adapter!=null){
init();
}
}
private void init() {
viewPager.setAdapter(null);
carouselLayout.removeAllViews();//清空之前的数据
if (adapter.isEmpty()){
return;
}
int count = adapter.getCount();
showCount = adapter.getCount();
for (int i=0;i<count;i++){
View view = new View(context);
//用来做指示器的View,通过state来做展示效果
if (currentPosition==i){
view.setPressed(true);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(pageItemWidth + ConvertUtils.dip2px(context,3),pageItemWidth + ConvertUtils.dip2px(context,3));
params.setMargins(pageItemWidth, 0, 0, 0);
view.setLayoutParams(params);
}else {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(pageItemWidth,pageItemWidth);
params.setMargins(pageItemWidth,0,0,0);
view.setLayoutParams(params);
}
view.setBackgroundResource(R.drawable.carousel_layout_page);
carouselLayout.addView(view);
}
viewPager.setAdapter(new ViewPagerAdapter());
viewPager.setCurrentItem(0);
//让手指触碰到的时候自动轮播不起效
this.viewPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
isUserTouched = true;
break;
case MotionEvent.ACTION_UP:
isUserTouched = false;
break;
}
return false;
}
});
mTimer.schedule(mTimerTask, 3000, 3000);
}
<com.yangqiangyu.test.carouselview.CarouselView
android:layout_width="match_parent"
android:layout_height="220dp">
</com.yangqiangyu.test.carouselview.CarouselView>
CarouselView carouselView = (CarouselView) findViewById(R.id.CarouselView);
carouselView.setAdapter(new CarouselView.Adapter() {
@Override
public boolean isEmpty() {
return false;
}
@Override
public View getView(int position) {
View view = mInflater.inflate(R.layout.item,null);
ImageView imageView = (ImageView) view.findViewById(R.id.image);
imageView.setImageResource(mImagesSrc[position]);
return view;
}
@Override
public int getCount() {
return mImagesSrc.length;
}
});
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有