轮播 ———–与———无限轮播

应用情景

无限轮播常见的应用有新闻类app,其对新闻进行滚动,点击后跳转到该新闻页面

无限轮播还常见于动态展示图片,丰富界面

轮播常见于手机app导航页面,跳转后进入主页面,再次进入后显示单个图片,自动或手动跳转

注意事项

1.网络加载注意添加internet 方法。

主要技术

采用技术主要有 ViewPager,viewPager的setOnPageChangeListener事件,imageView的OnTouchListener()事件,xUtils中BitmapUtils 的display()方法或者ImageLoader 的展示图片的方法,动态加载图片 ,自定义 shape。

主要功能实现

无限轮播,本地图片展示 思路

1.页面布局,常用 FrameLayout,里面设置ViewPager和展示小原点的父布局

2.1初始化控件,初始化viewPager和小圆点的父布局,一般为线性布局

2.2初始化小圆点

3.初始化数据 设置图片来源,为本地图片还是网络请求地址,采用不同的方式处理

4.设置适配器

5.设置相应的事件

功能点

1.轮播功能

  • 设置初始位置
    vp.setCurrentItem(10000*datas.length);
  • Integer.MAX_VALUE 设置最大数,ViewPager就能不会滑到头
  • 实例化ImageView,往ViewPager添加数据;由于图片源少,而展示个数posstion多,取余实现图片源和posstion 匹配

    ImageView image=new ImageView(MainActivity.this);
    int index=position%datas.length;
    //设置图片源
    image.setImageResource(datas[index]);
    image.setScaleType(ImageView.ScaleType.CENTER_CROP);
    //设置宽高
    image.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    container.addView(image);

2.自动播放

`Handler mHandler=new Handler(){
    public void handleMessage(android.os.Message msg) {
        int item = vp.getCurrentItem();
        vp.setCurrentItem(++item);
        mHandler.sendEmptyMessageDelayed(0, 1000);
    };
};`

oncreat()方法中,初次调用

`mHandler.sendEmptyMessageDelayed(0, 1000);`

3.自动轮播,点击图片暂停,离开后继续自动播放

  • 实现触摸监听事件,效果为点击不进行自动播放
`
    image.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mHandler.removeCallbacksAndMessages(null);
                break;
            case MotionEvent.ACTION_UP:
                mHandler.sendEmptyMessageDelayed(0, 1000);
                break;
            case MotionEvent.ACTION_CANCEL:
                mHandler.sendEmptyMessageDelayed(0, 1000);
                break;

            default:
                break;
            }
            return true;
        }
    });

4.网络图片处理 现主要为两种方式,一种为 xUtils, 一为 ImageLoader

`BitmapUtils bitmapUtils=new BitmapUtils(context);
    bitmapUtils.display(img, list.get(index));` 

`ImageLoader.getInstance().displayImage(list.get(position), img,options);`

完整代码

  • 布局
`<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
 >
    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         />
    <LinearLayout 
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:gravity="center"
        ></LinearLayout>

</FrameLayout>`
  • 原点一,聚焦的圆点
`<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval">
    <solid android:color="#ff7575"/>

</shape>`
  • 原点二,正常的圆点
`<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval">
    <solid android:color="#c7c7e2"/>
</shape>`
  • 主要代码
`import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
    private List<ImageView> list;
private int []datas=new int[]{R.drawable.guide1,R.drawable.guide11,R.drawable.guide12,R.drawable.guide13,R.drawable.guide2,R.drawable.guide3};
    Handler mHandler=new Handler(){
        public void handleMessage(android.os.Message msg) {
            int item = vp.getCurrentItem();
            vp.setCurrentItem(++item);
            mHandler.sendEmptyMessageDelayed(0, 1000);
        };
    };
    private ViewPager vp;
    private LinearLayout ll;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        //初始化控件

        vp = (ViewPager) findViewById(R.id.vp);
        ll = (LinearLayout) findViewById(R.id.ll);
        vp.setAdapter(new MyAdapter());
        vp.setCurrentItem(10000*datas.length);
        mHandler.sendEmptyMessageDelayed(0, 1000);
        //初始化 View
        initDot();
        //设置监听事件
        vp.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                for(int i=0;i<list.size();i++){
                    int j=arg0%list.size();
                    if(j==i){
                        list.get(i).setImageResource(R.drawable.dot_focus);
                    }else{
                        list.get(i).setImageResource(R.drawable.dot_nomal);
                    }
                }

            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub

            }
        });
    }
    private void initDot() {
        list=new ArrayList<ImageView>();
        for(int i=0;i<datas.length;i++){
            ImageView img=new ImageView(this);
            img.setLayoutParams(new ViewGroup.MarginLayoutParams(20, 20));
            //设置默认
            if(i==0){
                img.setImageResource(R.drawable.dot_focus);
            }else{
                img.setImageResource(R.drawable.dot_nomal);
            }
            list.add(img);
            ll.addView(img);
        }

    }
    class MyAdapter extends PagerAdapter{

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return Integer.MAX_VALUE;
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            // TODO Auto-generated method stub
            return arg0==arg1;
        }
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            ImageView image=new ImageView(MainActivity.this);
            int index=position%datas.length;
            //设置图片源
            image.setImageResource(datas[index]);
            image.setScaleType(ImageView.ScaleType.CENTER_CROP);
            //设置宽高
            image.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            container.addView(image);
            image.setOnTouchListener(new OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        mHandler.removeCallbacksAndMessages(null);
                        break;
                    case MotionEvent.ACTION_UP:
                        mHandler.sendEmptyMessageDelayed(0, 1000);
                        break;
                    case MotionEvent.ACTION_CANCEL:
                        mHandler.sendEmptyMessageDelayed(0, 1000);
                        break;

                    default:
                        break;
                    }
                    return true;
                }
            });
            return image;
        }
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((ImageView)object);
        }

    }
}

`

t