图片

本文介绍了一种基于Android的轮播图实现方法,通过自定义ViewPagerAdapter来管理ViewPager中的图片资源,并结合FragmentPagerAdapter实现页面切换动画效果。此外,还介绍了如何通过监听触摸事件来控制轮播间隔。


ViewPagerAdapter

public class ViewPagerAdapter extends PagerAdapter {



    private String[] image;
    private Context context;
    private Handler handler;




    public ViewPagerAdapter(String[] image, Context context,Handler handler) {
        this.image = image;
        this.context = context;
        this.handler = handler;
    }


    @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) {


        ImageView imageView = new ImageView(context);
        ImageLoader.getInstance().displayImage(image[position%image.length],imageView, ImageLoadler.getOptions());




        imageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {


                switch (event.getAction()){


                    //按下
                    case MotionEvent.ACTION_DOWN:
                        handler.removeCallbacksAndMessages(null);


                        break;
                    //移动
                    case MotionEvent.ACTION_MOVE:
                        handler.removeCallbacksAndMessages(null);
                        break;
                    //抬起
                    case MotionEvent.ACTION_UP:
                        handler.sendEmptyMessageDelayed(0,2000);
                        break;
                    //结束
                    case MotionEvent.ACTION_CANCEL:
                        handler.sendEmptyMessageDelayed(0,2000);
                        break;


                }
                return true;
            }
        });
        container.addView(imageView);




        return imageView;
    }


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


        container.removeView((View) object);
    }

}


Fragment_one 

public class Fragment_one extends Fragment {




    private String[] imags = {
            "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1530147896&di=a108779183cfcf652d8b0e575326e3f1&imgtype=jpg&er=1&src=http%3A%2F%2Fg.hiphotos.baidu.com%2Fzhidao%2Fpic%2Fitem%2F0bd162d9f2d3572ca715ccac8613632763d0c3cf.jpg",
            "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1109914389,2791689143&fm=27&gp=0.jpg",
            "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1530148203&di=f76108132220d420f20e670007cbfc7c&imgtype=jpg&er=1&src=http%3A%2F%2Ff10.topitme.com%2Fo042%2F10042332873d775e7b.jpg",
            "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1529553529652&di=b620d433ed2c93c296e1bf5434594399&imgtype=0&src=http%3A%2F%2Fgame.ahgame.com%2Fuploads%2Fallimg%2F171120%2F1-1G120102133.jpg",
            "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1529553594735&di=4133e5bb6f4221acbc673d0518e34ed6&imgtype=jpg&src=http%3A%2F%2Fimg1.imgtn.bdimg.com%2Fit%2Fu%3D1706558701%2C1505343713%26fm%3D214%26gp%3D0.jpg"
    };
    private String path = "http://gank.io/api/data/";
    private ViewPager viewPager;
    private LinearLayout linearLayout;
    private List<ImageView> imag_list = new ArrayList<>();
    private HttpUtils httpUtils;
    private ViewPagerAdapter adapter;
    private boolean mash;
    private RelativeLayout relativeLayout;
    private int i;//接受当前的页
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
                //接受当前的位置
                i = viewPager.getCurrentItem();
                //改变页的选中
                viewPager.setCurrentItem(i+1);


                handler.sendEmptyMessageDelayed(1,2000);


        }
    };


    //单例得到Fragment
    public static Fragment_one getInstance(String string){


        Fragment_one fragment_one = new Fragment_one();
        //接受传来的值
        Bundle bundle = new Bundle();
        bundle.putString("string",string);
        fragment_one.setArguments(bundle);
        return fragment_one;
    }




    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {


        Log.i("TAG","onCreateView");
        View view = inflater.inflate(R.layout.fragmentone,container,false);


        viewPager = view.findViewById(R.id.viewpager2);
        linearLayout = view.findViewById(R.id.ll);
        relativeLayout  = view.findViewById(R.id.f_relativelayout);




        return view;
    }






    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);


        //得到网络的网络的状态
        mash = ConnecitivtUtils.getInstance().isMash(getActivity());
        Bundle arguments = getArguments();
        //取值赋值
        if(arguments.get("string").equals("头条")){
            //请求数据
            //判断当前网络
            if(mash){
                initview();
                adapter = new ViewPagerAdapter(imags,getActivity(),handler);
                viewPager.setAdapter(adapter);
                //开始轮播
                handler.sendEmptyMessageDelayed(1,2000);
                //滑动选择对应的图片
                viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                    @Override
                    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                    }
                    @Override
                    public void onPageSelected(int position) {
                        for (int i =0; i < imag_list.size();i++){
                            if(i==position%imag_list.size()){
                                imag_list.get(i).setSelected(true);
                            }else{
                                imag_list.get(i).setSelected(false);
                            }
                        }
                    }
                    @Override
                    public void onPageScrollStateChanged(int state) {
                    }
                });


            }else{
                //从缓存中去图片


            }


        }




    }


    //创建小圆点
    private void initview() {


        for (int i =0; i < imags.length;i++){
            //创建图片
            ImageView imageView = new ImageView(getActivity());
            //设置选择器
            imageView.setImageResource(R.drawable.imageselector);


            linearLayout.addView(imageView);


            //添加到集合
            imag_list.add(imageView);
        }
        //设置默认选中的远点
        imag_list.get(0).setSelected(true);


    }


    //请求不同的数据
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);


        Log.i("TAG","setUserVisibleHint");


        Bundle arguments = getArguments();
        //取值赋值
        if(isVisibleToUser && arguments.get("string").equals("头条")){
            //请求数据
            //判断当前网络
            if(mash){


                getData("Android/10/1");


            }else{
                //从缓存中去图片
            }


        }else if(isVisibleToUser && arguments.get("string").equals("娱乐")){
            relativeLayout.setVisibility(View.GONE);


            getData("福利/10/1");


            Log.i("TAG","娱乐");
        }else if(isVisibleToUser && arguments.get("string").equals("科技")){
            Log.i("TAG","科技");
            relativeLayout.setVisibility(View.GONE);


            getData("iOS/10/1");


        }
    }




    //请求数据的方法    参数传入分类
    public void getData(String s){


        httpUtils= HttpUtils.getInstance();
        String url = path+s;
        httpUtils.getdata(url);
        httpUtils.setHttpListener(new HttpUtils.HttpListener() {
            @Override
            public void getjsondata(String json) {
                //请求数据


                //展示数据
            }
        });
    }




}



ImageLoadler


public class ImageLoadler extends Application{


    private Context context;


    @Override
    public void onCreate() {
        super.onCreate();


        context = this;


        //初始化
        initImageLoader();


    }


    private void initImageLoader() {
        String path = getExternalStorageDirectory()+"Image";
        File cacheDir = new File(path);  //缓存文件夹路径ir = new File(path);  //缓存文件夹路径
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                .memoryCacheExtraOptions(480, 800) // default = device screen dimensions 内存缓存文件的最大长宽
                .diskCacheExtraOptions(480, 800, null)  // 本地缓存的详细信息(缓存的最大长宽),最好不要设置这个
                .threadPoolSize(3) // default  线程池内加载的数量
                .threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级
                .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
                .memoryCacheSize(2 * 1024 * 1024)  // 内存缓存的最大值
                .memoryCacheSizePercentage(13) // default
                .diskCache(new UnlimitedDiskCache(cacheDir))//自定义缓存路径
                .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
                .diskCacheFileCount(100)  // 可以缓存的文件数量
                // default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())
                .writeDebugLogs() // 打印debug log
                .build(); //开始构建




        ImageLoader.getInstance().init(config);
    }






    //
    public static DisplayImageOptions getOptions(){


        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的图片
                .showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片
                .showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片
                .resetViewBeforeLoading(false)  // default 设置图片在加载前是否重置、复位
                .delayBeforeLoading(0)  // 下载前的延迟时间
                .cacheInMemory(true) // default  设置下载的图片是否缓存在内存中
                .cacheOnDisk(true) // default  设置下载的图片是否缓存在SD卡中
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
                .bitmapConfig(Bitmap.Config.ARGB_8888) // default 设置图片的解码类型
                .displayer(new RoundedBitmapDisplayer(300)) // default  还可以设置圆角图片new RoundedBitmapDisplayer(20)
                .handler(new Handler()) // default
                .build();


        return options;
    }

}


MainActivity

public class MainActivity extends AppCompatActivity {




    private String[] s = {"头条", "娱乐", "科技", "信息", "八卦", "北京", "上海", "天津","重庆", "大大燕网"};
    private HorizontalScrollView hs;
    private LinearLayout linearLayout;
    private ViewPager viewPager;
    private List<TextView> list;


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




        //获取资源ID
        hs = (HorizontalScrollView) findViewById(R.id.hs);
        linearLayout = (LinearLayout) findViewById(R.id.linearlayout);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        //初始化集合
        list = new ArrayList<>();




        //动态添加分类
        for (int i = 0;i <s.length;i++){


            //创建TextView
            final TextView textView = new TextView(this);
            textView.setText(s[i]);
            textView.setTextSize(20);
            textView.setId(i+1000);


            textView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


                    int id = v.getId();


                    viewPager.setCurrentItem(id-1000);


                }
            });




            //设置默认选中的颜色
            if(i==0){
               textView.setTextColor(Color.RED);
            }else{
                textView.setTextColor(Color.BLACK);
            }
            //设置textview的宽高 以及间距
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);


            layoutParams.setMargins(50,10,50,10);


            linearLayout.addView(textView,layoutParams);
            //将TextView存入List集合中
            list.add(textView);


        }
        //设置适配器
        viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public int getCount() {
                return list.size();
            }


            @Override
            public Fragment getItem(int position) {


                Log.i("TAG",position+"");
                return Fragment_one.getInstance(list.get(position).getText().toString());


            }
        });


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


                for (int i = 0;i <list.size();i++){
                    if(position==i){
                       list.get(i).setTextColor(Color.RED);
                    }else{
                        list.get(i).setTextColor(Color.BLACK);
                    }
                    //滑动ViewPager改变TextView的距离
                    //得到当前选中的Textview
                     TextView textView = list.get(position);
                     //width是每次滑动的距离
                     int width  = textView.getWidth()+10;
                    //设置当前滚动的位置   X Y
                     hs.scrollTo(width*position,0);
                }


            }


            @Override
            public void onPageSelected(int position) {


            }


            @Override
            public void onPageScrollStateChanged(int state) {


            }
        });

    }

}


ConnecitivtUtils


public class ConnecitivtUtils {






    private static ConnecitivtUtils connecitivtUtils;
    private boolean isConnectivit;//接受是否有网络的状态值


    public static ConnecitivtUtils getInstance() {


        connecitivtUtils = new ConnecitivtUtils();


        return connecitivtUtils;
    }


    //用来判断网络
    public boolean isMash(Context context){


        //得到系统的服务
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        //得到网络
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        //判断是否有网络
        if(networkInfo != null && networkInfo.isConnected()){
            isConnectivit = true;
        }else{
            isConnectivit = false;
        }


        return isConnectivit;


    }










}

HttpUtils


public class HttpUtils {


    private static HttpUtils httpUtils;


    private HttpListener httpListener;


    public static HttpUtils getInstance(){
        if(httpUtils == null){
            httpUtils = new HttpUtils();
        }
        return httpUtils;
    }


    //网络获得请求数据
    public void getdata(String url){
        Myasynctack asynctack = new Myasynctack();
        asynctack.execute(url);


    }


    class Myasynctack extends AsyncTask<String,Void,String>{


        @Override
        protected String doInBackground(String... params) {


            try {
                HttpClient client = new DefaultHttpClient();
                //设置请求方式
                HttpGet get = new HttpGet(params[0]);


                HttpResponse response = client.execute(get);


                int statusCode = response.getStatusLine().getStatusCode();


                if(statusCode == 200){


                    //得到请求到的数据
                    HttpEntity entity = response.getEntity();


                    String s = EntityUtils.toString(entity);


                    return s;
                }


            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);




            httpListener.getjsondata(s);


        }




    }




    //定义接口
    public interface HttpListener{


        void getjsondata(String json);
    }


    //向外提供当前的接口
    public void setHttpListener(HttpListener httpListener){
        this.httpListener = httpListener;


    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值