1. 程式人生 > >輪播圖小圓點可點選

輪播圖小圓點可點選

public class MainActivity extends AppCompatActivity {


    private ViewPager viewPager;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0){
                //viewPager顯示下一頁
                viewPager.setCurrentItem(viewPager.getCurrentItem() +1);


                //再次傳送延時訊息
                handler.sendEmptyMessageDelayed(0,2000);
            }
        }
    };
    private LinearLayout linearLayout;
    private List<ImageView> images;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        viewPager = (ViewPager) findViewById(R.id.view_pager);
        linearLayout = (LinearLayout) findViewById(R.id.linear_layout);


        //獲取輪播圖的資料
        getDataFromNet();
    }


    private void getDataFromNet() {
        AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() {
            @Override
            protected String doInBackground(Void... voids) {


                String path = "http://www.yulin520.com/a2a/impressApi/news/mergeList?pageSize=5&page=1";


                try {
                    URL url = new URL(path);


                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();


                    connection.setRequestMethod("GET");
                    connection.setReadTimeout(5000);
                    connection.setConnectTimeout(5000);


                    int responseCode = connection.getResponseCode();
                    if (responseCode == 200){
                        InputStream inputStream = connection.getInputStream();


                        String json = streamToString(inputStream,"utf-8");


                        return json;


                    }


                } catch (Exception e) {
                    e.printStackTrace();
                }


                return null;
            }


            @Override
            protected void onPostExecute(String s) {
                //列印以下資料看看是否獲取到
                Log.i("----",s);


                if (s != null){
                    Gson gson = new Gson();


                    DataDataBean dataDataBean = gson.fromJson(s, DataDataBean.class);


                    List<DataDataBean.DataBean> list = dataDataBean.getData();


                    //給viewPager設定介面卡
                    MyAdapter myAdapter = new MyAdapter(MainActivity.this, list,handler);


                    //設定介面卡
                    viewPager.setAdapter(myAdapter);


                    //3.根據集合的長度動態新增小圓點...linearLayout
                    initDoc(list);


                    //2.手動的可以無限滑動
                    viewPager.setCurrentItem(list.size()*100000);//設定當前展示中間某個足夠大的位置


                    handler.sendEmptyMessageDelayed(0,2000);//傳送一個延時的空訊息


                    //viewPage設定監聽事件
                    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                        @Override
                        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {


                        }


                        /**
                         * 當選中某個頁面的時候,把當前的小圓點背景變成綠色
                         * @param position
                         */
                        @Override
                        public void onPageSelected(int position) {


                            for (int i=0;i<images.size();i++){
                                if (i == position%images.size()){


                                    images.get(i).setImageResource(R.drawable.shape_01);
                                }else {
                                    images.get(i).setImageResource(R.drawable.shape_02);
                                }


                            }


                        }


                        @Override
                        public void onPageScrollStateChanged(int state) {


                        }
                    });
                }


            }
        };


        asyncTask.execute();


    }


    /**
     * 動態新增小圓點
     * @param list
     */
    private void initDoc(List<DataDataBean.DataBean> list) {
        //1.需要一個集合記錄一下小圓點的imageView控制元件
        images = new ArrayList<ImageView>();
        //2...linearLayout上面的檢視清空一下再去新增
        linearLayout.removeAllViews();


        for (int i=0;i<list.size();i++){
            ImageView imageView = new ImageView(MainActivity.this);


            if (i==0){
                imageView.setImageResource(R.drawable.shape_01);
            }else {
                imageView.setImageResource(R.drawable.shape_02);
            }


            //新增到集合去
            images.add(imageView);
            //新增到線性佈局上


            //這是佈局引數,,剛開始小圓點之間沒有距離,所以使用java程式碼指定寬度高度,並且指定小圓點之間的距離
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);


            params.setMargins(5,0,5,0);


            linearLayout.addView(imageView,params);
        }


    }




    private String streamToString(InputStream inputStream,String charset) {
        try {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset);


            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String s = null;
            StringBuilder builder = new StringBuilder();
            while ((s = bufferedReader.readLine()) != null){
                builder.append(s);
            }


            bufferedReader.close();
            return builder.toString();


        } catch (Exception e) {
            e.printStackTrace();
        }


        return  null;
    }

}

//viewpager介面卡配置

public class MyAdapter extends PagerAdapter {
    Context context;
    List<DataDataBean.DataBean> list;
    Handler handler;


    public MyAdapter(Context context, List<DataDataBean.DataBean> list, Handler handler) {
        this.context = context;
        this.list = list;
        this.handler = handler;
    }


    @Override
    public int getCount() {
        return Integer.MAX_VALUE;
    }


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


    /**
     * viewPager具有預載入,預設的前後載入一頁,,,預設的容器裡面最多三頁
     * @param container
     * @param position
     * @return
     */
    @Override
    public Object instantiateItem(ViewGroup container, int position) {


        //1.把這個當前展示的檢視新增到容器中...container
        ImageView imageView = new ImageView(context);


        //..........使圖片平鋪整個imageView控制元件
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);


        //imageLoader載入圖片到這個imageView控制元件上
        ImageLoader.getInstance().displayImage(list.get(position %list.size()).getImg(),imageView,ImageLoaderUtil.getDefaultOption());


        //給imageView設定觸控的監聽事件
        imageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {


                int action = motionEvent.getAction();//獲取手指的動作
                switch (action){
                    case MotionEvent.ACTION_DOWN://按下的動作...應該取消傳送訊息的操作
                        handler.removeCallbacksAndMessages(null);


                        break;
                    case MotionEvent.ACTION_MOVE://移動的動作
                        handler.removeCallbacksAndMessages(null);


                        break;
                    case MotionEvent.ACTION_CANCEL://取消
                        //重新發送
                        handler.sendEmptyMessageDelayed(0,2000);


                        break;
                    case MotionEvent.ACTION_UP://擡起的動作
                        handler.sendEmptyMessageDelayed(0,2000);


                        break;
                }




                //返回true表示自己處理觸控事件
                return true;
            }
        });


        container.addView(imageView);//新增到容器
        //2.把當前展示的檢視返回


        return imageView;
    }


    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {


        //銷燬檢視
        container.removeView((View) object);
    }
}