在Android的开发中,难免会遇到各种各样的技术型难题。一些比较新奇好玩的一些效果。原生的没有这些效果,so,我们只有自己写一些自定义控件,来满足我们的需求了。
轮播图控件,相信网上会有各种各样的控件,但是本着,学一点会一点的态度,发表代码,仅供参考
上代码
首先是视图布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="240dp"> <android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="240dp" > </android.support.v4.view.ViewPager> <LinearLayout android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="30dp" android:gravity="center" android:orientation="horizontal" android:layout_alignParentBottom="true" > </LinearLayout> </RelativeLayout>
当然,小圆点需要自己绘制
选中状态的小圆点
<?xml version="1.0" encoding="utf-8"?> <!--绘制选中状态下的图案,为圆形--> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <!--宽高分别为20dp--> <size android:height="20dp" android:width="20dp"></size> <!--红色代表选中--> <solid android:color="#ff00"></solid> </shape>
未选中状态的小圆点
<?xml version="1.0" encoding="utf-8"?> <!--绘制未选中状态下的图案,为圆形--> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <!--宽高分别为20dp--> <size android:height="20dp" android:width="20dp"></size> <!--灰色代表未选中状态--> <solid android:color="#55999999"></solid> </shape>下面是判断选中状态的代码
<?xml version="1.0" encoding="utf-8"?> <!--判断小圆点的选中状态--> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!--当state_selected为true时,判断为选中状态--> <item android:drawable="@drawable/click1" android:state_selected="true"></item> <!--当state_selected为false时,判断为未选中状态--> <item android:drawable="@drawable/click2" android:state_selected="false"></item> </selector>
这里是自定义控件的代码
public class Banner extends RelativeLayout { private MyHandler myHandler = new MyHandler(); //使用静态域,使其可以类名.调用方法 private static LinearLayout ll; private static ViewPager vp; private static List<ImageView> imageViews = new ArrayList<>();//图片的集合 private static List<ImageView> primes = new ArrayList<>();//小圆点的集合 private static Context myContext; /** * 重写三个构造方法 */ public Banner(Context context) { this(context,null); } public Banner(Context context, AttributeSet attrs) { this(context, attrs,0); } public Banner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); myContext = context; //获取本类视图 View view = View.inflate(context,R.layout.banner_layout,this); //获取控件 vp = view.findViewById(R.id.vp); ll = view.findViewById(R.id.ll); } //设置适配器供调用 public void setAdapter(PagerAdapter pagerAdapter){ vp.setAdapter(pagerAdapter); vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { //当页面滑动的时候回调方法 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } //当松开的时候回调方法 @Override public void onPageSelected(int position) { position = position%primes.size(); for (int i=0; i<primes.size();i++){ if(position==i){ primes.get(position).setSelected(true); }else{ primes.get(i).setSelected(false); } } } //当状态改变时回调函数 @Override public void onPageScrollStateChanged(int state) { } }); } //开启自动轮播 public void autoPlay(){ myHandler.sendEmptyMessageDelayed(0,2000); } //停止自动轮播 public void stopPlay(){ myHandler.removeCallbacksAndMessages(null); } //实现Hnadler方法 public class MyHandler extends Handler{ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //获取当前视图的item,进行加一后再赋值给当前item,实现视图改变 vp.setCurrentItem(vp.getCurrentItem()+1); //开启handler,每隔2000毫秒执行一次 myHandler.sendEmptyMessageDelayed(0,2000); } } //静态域实现内部类适配器 public static class MyAdapter extends PagerAdapter{ //获取传递过来的视图 public MyAdapter (List<ImageView> list){ //把获取到的视图赋值给本类视图 imageViews = list; //设置小圆点,小圆点的数量要和视图一样多 for(int i=0;i<imageViews.size();i++){ //存放小圆点的视图控件 ImageView p = new ImageView(myContext); //把判断好的小圆点放入控件中 p.setImageResource(R.drawable.cl1); //设置两点间的距离 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(10,0,10,0); p.setLayoutParams(params); //添加到primes集合中 primes.add(p); //添加到LinearLayout控件中 ll.addView(p); } //设置默认选中的状态 primes.get(0).setSelected(true); } //返回无限多的视图 @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } @Override public Object instantiateItem(ViewGroup container, int position) { position = position % imageViews.size();//磨除防止内存溢出 container.addView(imageViews.get(position)); return imageViews.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } }下面是使用此控件的代码一个案例
//获取到的图片的集合 List<GetAdBean.DataBean> data1 = getAdBean.getData(); //得到一个存放图片(视图)的集合 list = new ArrayList<ImageView>(); //便利此集合 这里的data1是我获取的图片数据的集合 for (int i=0;i<data1.size();i++){ //获取到一个存放图片的控件 ImageView img = new ImageView(this); //img.setImageResource(img1[i]);//用来存放本地图片 ImageLoader.getInstance().displayImage(data1.get(i).getIcon(),img);//用来存放网络图片 img.setScaleType(ImageView.ScaleType.CENTER_CROP);//对图片进行裁剪 list.add(img);//把图片放入集合 } //获取到自定义控件中的内部适配器 Banner.MyAdapter adapter = new Banner.MyAdapter(list); //调用设置适配器的方法 banner.setAdapter(adapter); //开启自动轮播 banner.autoPlay();好啦,这是一个简单的自定义控件,来实现轮播图+小圆点