Demo实现的效果图如下:
自定义轮播图
public class SlideShowView extends FrameLayout { // 用的ImageLoader加载图片 universal-image-loader-1.8.6-with-sources.jar private ImageLoader imageLoader = ImageLoader.getInstance(); //图片张数 private final static int IMAGE_COUNT = 5; //时间间隔 private final static int TIME_INTERVAL = 5; //是否自动播放 private final static boolean isAutoPlay = true; //图片Urls的数组 private String[] imageUrls; private String[] text; //图片的集合 private List<ImageView> imageViewsList; //指示点的集合 private List<View> dotViewsList; private ViewPager viewPager; //当前子项 private int currentItem = 0; //预定的执行者服务 private ScheduledExecutorService scheduledExecutorService; private Context context; private TextView tip; //Handler private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); viewPager.setCurrentItem(currentItem,false); tip.setText(text[currentItem]); if (msg.what == 100) { Intent intent = new Intent(context, WebActivity.class); String url = imageUrls[currentItem]; intent.putExtra("url", url); context.startActivity(intent); } } }; public SlideShowView(Context context) { this(context, null); // TODO Auto-generated constructor stub } public SlideShowView(Context context, AttributeSet attrs) { this(context, attrs, 0); // TODO Auto-generated constructor stub } public SlideShowView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; initImageLoader(context); initData(); if (isAutoPlay) { startPlay(); } } /** * 开始播放 */ private void startPlay() { scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); scheduledExecutorService.scheduleAtFixedRate(new SlideShowTask(), 1, 4, TimeUnit.SECONDS); } /** * ֹͣ停止播放 */ private void stopPlay() { scheduledExecutorService.shutdown(); } /** * 获得数据 */ private void initData() { imageViewsList = new ArrayList<ImageView>(); dotViewsList = new ArrayList<View>(); // 任务执行 new GetListTask().execute(""); } /** * 更新UI */ private void initUI(final Context context) { if (imageUrls == null || imageUrls.length == 0) return; LayoutInflater.from(context).inflate(R.layout.layout_slideshow, this, true); tip= (TextView) findViewById(R.id.tv_tip_text); LinearLayout dotLayout = (LinearLayout) findViewById(R.id.dotLayout); dotLayout.removeAllViews(); // 图片循环 for (int i = 0; i < imageUrls.length; i++) { ImageView view = new ImageView(context); view.setTag(imageUrls[i]); if (i == 0)//初始化 view.setBackgroundResource(R.drawable.iv_loading); view.setScaleType(ScaleType.FIT_XY); imageViewsList.add(view); ImageView dotView = new ImageView(context); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.leftMargin = 4; params.rightMargin = 4; dotLayout.addView(dotView, params); dotViewsList.add(dotView); } viewPager = (ViewPager) findViewById(R.id.viewPager); viewPager.setFocusable(true); viewPager.setAdapter(new MyPagerAdapter()); viewPager.setOnPageChangeListener(new MyPageChangeListener()); } /** * 继承PageAdapter */ private class MyPagerAdapter extends PagerAdapter { @Override public void destroyItem(View container, int position, Object object) { // TODO Auto-generated method stub //((ViewPag.er)container).removeView((View)object); ((ViewPager) container).removeView(imageViewsList.get(position)); } @Override public Object instantiateItem(View container, int position) { ImageView imageView = imageViewsList.get(position); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { handler.sendEmptyMessage(100); } }); imageLoader.displayImage(imageView.getTag() + "", imageView); ((ViewPager) container).addView(imageViewsList.get(position)); return imageViewsList.get(position); } @Override public int getCount() { // TODO Auto-generated method stub return imageViewsList.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == arg1; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { // TODO Auto-generated method stub } @Override public Parcelable saveState() { // TODO Auto-generated method stub return null; } @Override public void startUpdate(View arg0) { // TODO Auto-generated method stub } @Override public void finishUpdate(View arg0) { // TODO Auto-generated method stub } } /** * 监听图片变化 */ private class MyPageChangeListener implements OnPageChangeListener { boolean isAutoPlay = false; @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub switch (arg0) { case 1: isAutoPlay = false; break; case 2: isAutoPlay = true; break; case 0: if (viewPager.getCurrentItem() == viewPager.getAdapter().getCount() - 1 && !isAutoPlay) { viewPager.setCurrentItem(0); } else if (viewPager.getCurrentItem() == 0 && !isAutoPlay) { viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 1); } break; } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageSelected(int pos) { // TODO Auto-generated method stub currentItem = pos; for (int i = 0; i < dotViewsList.size(); i++) { if (i == pos) { ((View) dotViewsList.get(pos)).setBackgroundResource(R.drawable.dot_focus); } else { ((View) dotViewsList.get(i)).setBackgroundResource(R.drawable.dot_blur); } } } } /** * ִ线程执行图片显示任务 */ private class SlideShowTask implements Runnable { @Override public void run() { // TODO Auto-generated method stub synchronized (viewPager) { currentItem = (currentItem + 1) % imageViewsList.size(); handler.obtainMessage().sendToTarget(); } } } /** * 图片销毁 */ private void destoryBitmaps() { for (int i = 0; i < IMAGE_COUNT; i++) { ImageView imageView = imageViewsList.get(i); Drawable drawable = imageView.getDrawable(); if (drawable != null) { //���drawable��view������ drawable.setCallback(null); } } } /** * 异步加载 */ class GetListTask extends AsyncTask<String, Integer, Boolean> { @Override protected Boolean doInBackground(String... params) { try { // ����һ����÷���˽ӿڻ�ȡһ���ֲ�ͼƬ�������ǴӰٶ��ҵļ���ͼƬ imageUrls = new String[]{ "http://img.pconline.com.cn/images/upload/upc/tx/photoblog/1410/15/c3/39711717_1413384114121.jpg", "http://pic.4j4j.cn/upload/pic/20130815/5e604404fe.jpg", "http://img0.imgtn.bdimg.com/it/u=2916782399,3031162925&fm=21&gp=0.jpg", "http://image.tianjimedia.com/uploadImages/2015/141/22/91GSUE97M5V7_1000x500.jpg" }; text=new String[]{ "曾以为我会忘了你,象忘记一颗夏夜的星...", "多想在飘洒的红叶中,倾尽韶华的妩媚和...", "微风乍起,迎来层层涟漪,然后又恢复最...", "一阵达达的清脆马蹄声,敲碎了街口的寂..." }; return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); if (result) { initUI(context); } } } /** * ImageLoader 图片加载 * * @param context */ public static void initImageLoader(Context context) { // This configuration tuning is custom. You can tune every option, you // may tune some of them, // or you can create default configuration by // ImageLoaderConfiguration.createDefault(this); // method. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory().discCacheFileNameGenerator(new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.LIFO).writeDebugLogs() // Remove // for // release // app .build(); // Initialize ImageLoader with configuration. ImageLoader.getInstance().init(config); } }布局:
<?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="match_parent"> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:id="@+id/dotLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:gravity="right" android:orientation="horizontal" android:padding="8dp"> <View android:id="@+id/v_dot1" android:layout_width="8dp" android:layout_height="8dp" android:background="@drawable/dot_focus" /> <View android:id="@+id/v_dot2" android:layout_width="8dp" android:layout_height="8dp" android:layout_marginLeft="5dp" android:background="@drawable/dot_blur" /> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp" android:layout_alignParentBottom="true" android:background="@color/cardview_shadow_start_color"> <TextView android:id="@+id/tv_tip_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:text="晴天雨天我只想要和你聊天" android:paddingLeft="5dp" android:textColor="@color/white"/> </RelativeLayout> </RelativeLayout>在Activity使用时只需要写个布局就行了