ViewPager + Handler 自动轮播 动态改变指示点

主页面

package com.example.mnyk;

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import com.google.gson.Gson;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

public class MyFragment extends android.support.v4.app.Fragment {

    private View view;
    private ViewPager vp_my;
    private NewAdapter nadapter;
    private String urlImage = "http://www.xieast.com/api/banner.php";

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            int x = vp_my.getCurrentItem();
            x++;
            vp_my.setCurrentItem(x);
            send();
        }
    };
    private LinearLayout ll;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = View.inflate(getActivity(), R.layout.fragment_my, null);

        //初始化资源控件
        initViews();

        nadapter = new NewAdapter(getActivity());

        //加载网络图片 实现轮播效果
        loadImage();

        vp_my.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            //0 - MAX_VALUE
            @Override
            public void onPageSelected(int position) {
                //0 -3
                switchDot();
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        vp_my.setAdapter(nadapter);
        return view;
    }

    //加载网络图片
    private void loadImage() {
        new AsyncTask<String, Void, List<LoadImage.DataBean>>() {
            @Override
            protected List<LoadImage.DataBean> doInBackground(String... strings) {

                LoadImage loadImage = null;
                try {
                    //1.获取地址
                    URL url = new URL(strings[0]);
                    //2.打开连接
                    HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
                    //3.请求方法
                    httpURLConnection.setRequestMethod("GET");
                    //4.设置读取超时
                    httpURLConnection.setReadTimeout(5000);
                    //5.设置连接超时
                    httpURLConnection.setConnectTimeout(5000);
                    //6.请求结果
                    int responseCode = httpURLConnection.getResponseCode();
                    if (responseCode == 200){
                      String result = steam2String(httpURLConnection.getInputStream());
                      loadImage = new Gson().fromJson(result, LoadImage.class);
                    }

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return loadImage == null ? null : loadImage.getData();
            }

            @Override
            protected void onPostExecute(List<LoadImage.DataBean> dataBeans) {
                if (dataBeans == null){
                    Toast.makeText(getActivity(),"请求网络图片失败",Toast.LENGTH_SHORT).show();
                    return;
                }
                nadapter.setData(dataBeans);

                //
                for (int i = 0; i < nadapter.getRealCount(); i++) {
                    View view = new View(getActivity());
                    // 设置背景
                    view.setBackgroundResource(R.drawable.dot_normal);
                    //设置布局参数
                    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(getResources().getDimensionPixelOffset(R.dimen.dotSize),
                            getResources().getDimensionPixelOffset(R.dimen.dotSize));
                    params.leftMargin = getResources().getDimensionPixelOffset(R.dimen.dotSize);
                    params.rightMargin = getResources().getDimensionPixelOffset(R.dimen.dotSize);

                    ll.addView(view, params);
                }

                switchDot();

                send();
            }
        }.execute(urlImage);
    }

    private void switchDot() {
        int currentPosition = vp_my.getCurrentItem() % nadapter.getRealCount();
        //所有孩子
        for (int i = 0; i < ll.getChildCount(); i++) {
            ll.getChildAt(i).setBackgroundResource(i == currentPosition ? R.drawable.dot_sel:R.drawable.dot_normal);
        }
    }

    private void send() {

        handler.sendEmptyMessageDelayed(1,1000);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        handler.removeMessages(1);
    }
    private String steam2String(InputStream is) {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        try {
            for (String tmp = reader.readLine(); tmp != null; tmp = reader.readLine()){
                sb.append(tmp);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

    //获取资源id
    private void initViews() {
        vp_my = (ViewPager) view.findViewById(R.id.vp_my);
        ll = (LinearLayout) view.findViewById(R.id.ll);
    }
}

创建适配器 NewAdapter

package com.example.mnyk;

import android.content.Context;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.ArrayList;
import java.util.List;

class NewAdapter extends PagerAdapter{

    private Context context;
    private List<LoadImage.DataBean> mdataBeans;

    public NewAdapter(Context context) {
        this.context =context;
      this.mdataBeans = new ArrayList<>();
    }
    public void setData(List<LoadImage.DataBean> dataBeans) {
        this.mdataBeans.clear();
        if (dataBeans != null){
            this.mdataBeans.addAll(dataBeans);
        }
        notifyDataSetChanged();
    }

    //给 viewpager 使用 无限
    @Override
    public int getCount() {
        return this.mdataBeans.size() > 0 ? Integer.MAX_VALUE : 0;
    }

    public int getRealCount() {
        return mdataBeans.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        ImageView imageView = new ImageView(context);

        ImageLoader.getInstance().displayImage(mdataBeans.get(position % mdataBeans.size()).getImg(),imageView,Config.display());
        container.addView(imageView);
        return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);

    }
}


创建Bean类

package com.example.mnyk;

import java.util.List;

class LoadImage {
    private int code;
    private String msg;
    private List<DataBean> data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {

        private String author_name;
        private String category;
        private String date;
        private String img;
        private String title;
        private String uniquekey;
        private String url;

        public String getAuthor_name() {
            return author_name;
        }

        public void setAuthor_name(String author_name) {
            this.author_name = author_name;
        }

        public String getCategory() {
            return category;
        }

        public void setCategory(String category) {
            this.category = category;
        }

        public String getDate() {
            return date;
        }

        public void setDate(String date) {
            this.date = date;
        }

        public String getImg() {
            return img;
        }

        public void setImg(String img) {
            this.img = img;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getUniquekey() {
            return uniquekey;
        }

        public void setUniquekey(String uniquekey) {
            this.uniquekey = uniquekey;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }
    }
}

布局页面

<?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/vp_my"
        android:layout_width="match_parent"
        android:layout_height="200dp"/>

   <LinearLayout
       android:id="@+id/ll"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignBottom="@id/vp_my"
       android:layout_centerHorizontal="true"
       android:orientation="horizontal"
       android:padding="8dp"
       >
   </LinearLayout>

</RelativeLayout>

Imgae-loade 加载图片

package com.example.mnyk;

import android.app.Application;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

public class MApp extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration.Builder(this)
                //设置磁盘缓存大小
                .diskCacheSize(50*1024*1024)
                //设置内存缓存大小
                .memoryCacheSize(10)
                //设置图片展示
                .defaultDisplayImageOptions(Config.displaycle())

                .build();
        ImageLoader.getInstance().init(imageLoaderConfiguration);
    }
}


                          //设置图片展示样式
package com.example.mnyk;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;

public class Config {
    //设置图片正常显示方法
    public static DisplayImageOptions display(){
        DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
                //是否缓存到磁盘
                .cacheOnDisk(true)
                //是否缓存到内存
                .cacheInMemory(true)
                //设置图片加载情况
                //加载中
                .showImageOnLoading(R.drawable.ic_launcher_background)
                //加载失败
                .showImageOnFail(R.drawable.ic_launcher_background)
                //加载图片为空时
                .showImageForEmptyUri(R.drawable.ic_launcher_background)

                .build();
        return displayImageOptions;
    }
    //设置图片为圆形时显示方法
    public static DisplayImageOptions displaycle(){
        DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
                //是否缓存到磁盘
                .cacheOnDisk(true)
                //是否缓存到内存
                .cacheInMemory(true)
                //设置图片加载情况
                //加载中
                .showImageOnLoading(R.drawable.ic_launcher_background)
                //加载失败
                .showImageOnFail(R.drawable.ic_launcher_background)
                //加载图片为空时
                .showImageForEmptyUri(R.drawable.ic_launcher_background)
                //设置图片为圆形
                .displayer(new CircleBitmapDisplayer())
                .build();
        return displayImageOptions;
    }
}

设置指示点间隔

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="dotSize">8dp</dimen>
</resources>

设置指示点选中时的颜色

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <size android:width="8dp" android:height="8dp"/>
    <solid android:color="#ff0000"/>
</shape>

设置指示点未选中时的颜色

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <size android:height="8dp" android:width="8dp"/>
    <solid android:color="#90ffffff"/>
</shape>

猜你喜欢

转载自blog.csdn.net/LZ0419/article/details/83376773