Android ViewPager实现多个图片水平滚动

1.示意图

          

          

2.实现分析

(1).xml配置

<!-- 配置container和pager的clipChildren=false, 并且指定marginLeft 和 marginRight 的值-->
<LinearLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:clipChildren="false"
    android:gravity="center_horizontal"
    android:layerType="software"
    android:orientation="horizontal" >  

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="110dp"
        android:layout_marginRight="110dp"
        android:clipChildren="false" >
    </android.support.v4.view.ViewPager>
</LinearLayout>  

(2).java代码

// 1.设置幕后item的缓存数目
viewPager.setOffscreenPageLimit(3);
// 2.设置页与页之间的间距
viewPager.setPageMargin(10);
// 3.将父类的touch事件分发至viewPgaer,否则只能滑动中间的一个view对象
container.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return viewPager.dispatchTouchEvent(event);
    }
});  

3.代码实现

/**
 * MainActivity.java
 *
 * @author http://blog.csdn.net/zimo2013
 *
 */
public class MainActivity extends Activity implements OnPageChangeListener {  

    private ViewPager viewPager;
    private List<View> views = new ArrayList<View>();  

    private LinearLayout container;
    private TextView tvTitle;
    private LayoutInflater inflater;  

    private String dir;  

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

        inflater = getLayoutInflater();
        container = (LinearLayout) findViewById(R.id.container);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        tvTitle = (TextView) findViewById(R.id.title);  

        //这里预先在sdcard准备一些轮播图片资源
        dir = Environment.getExternalStorageDirectory().getAbsolutePath();
        // 得到views集合
        views = new ArrayList<View>();
        //此处可以根据需要自由设定,这里只是简单的测试
        for (int i = 1; i <= 12; i++) {
            View view = inflater.inflate(R.layout.guide_item, null);
            views.add(view);
        }  

        /////////////////////主要配置//////////////////////////////////////  

        // 1.设置幕后item的缓存数目
        viewPager.setOffscreenPageLimit(3);
        // 2.设置页与页之间的间距
        viewPager.setPageMargin(10);
        // 3.将父类的touch事件分发至viewPgaer,否则只能滑动中间的一个view对象
        container.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return viewPager.dispatchTouchEvent(event);
            }
        });  

        ////////////////////////////////////////////////////////////////
        viewPager.setAdapter(new MyAdapter()); // 为viewpager设置adapter
        viewPager.setOnPageChangeListener(this);// 设置监听器
    }  

    // PagerAdapter是object的子类
    class MyAdapter extends PagerAdapter {  

        /**
         * PagerAdapter管理数据大小
         */
        @Override
        public int getCount() {
            return views.size();
        }  

        /**
         * 关联key 与 obj是否相等,即是否为同一个对象
         */
        @Override
        public boolean isViewFromObject(View view, Object obj) {
            return view == obj; // key
        }  

        /**
         * 销毁当前page的相隔2个及2个以上的item时调用
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object); // 将view 类型 的object熊容器中移除,根据key
        }  

        /**
         * 当前的page的前一页和后一页也会被调用,如果还没有调用或者已经调用了destroyItem
         */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            System.out.println("pos:" + position);
            View view = views.get(position);
            // 如果访问网络下载图片,此处可以进行异步加载
            ImageView img = (ImageView) view.findViewById(R.id.icon);
            img.setImageBitmap(BitmapFactory.decodeFile(dir + getFile(position)));
            container.addView(view);
            return views.get(position); // 返回该view对象,作为key
        }
    }  

    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        if (viewPager != null) {
            viewPager.invalidate();
        }
    }  

    // 一个新页被调用时执行,仍为原来的page时,该方法不被调用
    public void onPageSelected(int position) {
        tvTitle.setText(getFile(position));
    }  

    /*
     * SCROLL_STATE_IDLE: pager处于空闲状态 SCROLL_STATE_DRAGGING: pager处于正在拖拽中
     * SCROLL_STATE_SETTLING: pager正在自动沉降,相当于松手后,pager恢复到一个完整pager的过程
     */
    public void onPageScrollStateChanged(int state) {
    }  

    public String getFile(int position) {
        return "/img" + ((position + 1) >= 10 ? (position + 1) : "0" + (position + 1)) + ".png";
    }
}  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="15dp"
    android:layout_marginRight="15dp"
    android:layout_marginTop="50dp"
    android:orientation="vertical" >  

    <View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="#ffbd2021" />  

    <!-- 配置container和pager的clipChildren=false, 并且指定marginLeft 和 marginRight 的值 -->  

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:clipChildren="false"
        android:gravity="center_horizontal"
        android:layerType="software"
        android:orientation="horizontal" >  

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="110dp"
            android:layout_marginRight="110dp"
            android:clipChildren="false" >
        </android.support.v4.view.ViewPager>
    </LinearLayout>  

    <View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="#ffbd2021" />  

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/line" />  

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:scaleType="fitXY"
        android:src="@drawable/ic_launcher"
        android:text="baidu"
        android:textSize="18sp" />  

</LinearLayout>  
时间: 2024-10-13 17:45:16

Android ViewPager实现多个图片水平滚动的相关文章

Android ViewPager真正的实现无限循环滚动

在存放View的集合中的第一个位置放入真正的最后一个View,而在最后一个放入第一个.具体请参照下图以及代码! package com.xinye.ui;   import java.util.ArrayList; import java.util.HashMap;   import net.tsz.afinal.FinalBitmap; import net.tsz.afinal.FinalHttp; import net.tsz.afinal.http.AjaxCallBack;   imp

[androidUI特效]android中TextView中如何设置水平滚动效果

如何让文本实现走马灯的效果,下面就一起实现下吧~~~~~~ package irdc.ScrollingText; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class ScrollingText extends Activity { public TextView t1; /** Called when the activity is first c

Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片

Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在ViewPager中添加多张网络请求图片的情况下,不能进行复用,导致每次都要重新去求情已经请求过的数据致使流量数据过大 自定义的数据结构解决了这个问题,固定传递的图片数据之后进行统一请求,完成后进行页面切换数据复用 代码中涉及网络请求是用的Volley网络请求框架 PicCarousel是网络数据请求的U

Android开发之实现图片自动滚动显示标签的ViewPager

Android中实现图片自动滚动的效果非常的常见,我们可以自己动画去实现功能.但是在Android中提供了一个ViewPager类,实现了滚动效果,在Android的extras目录下android-support-vx.jar中,x代表版本4,7等等.使用时我们需要android.support.v4.view.ViewPager的viewPager标签. 博客来源:http://blog.csdn.net/fengshizty 代码非常的简单,不用解释: xml布局文件如下: <Relati

Android ViewPager和ScrollView嵌套滚动问题解决方案

问题描述: 我的嵌套是ViewPager-->ScrollView-->ViewPager. 首先最里面的ViewPager水平滚动时总是会触发最外层的ViewPager滚动,看了网上很多的解决办法基本上是一样的,需要自定义ViewPager. import android.content.Context; import android.graphics.PointF; import android.support.v4.view.ViewPager; import android.util.

Android 自定义 ViewPager 打造千变万化的图片切换效果

Android 自定义 ViewPager 打造千变万化的图片切换效果 标签: Android自定义ViewPagerJazzyViewPager 目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPa

Android学习——HorizontalScollview水平滚动控件

HorizatalScollView控件只是支持水平滚动,而且它只能包含一个控件,通常是在<HorizatalScollView>标签中定义一个<LinearLayout> 标签并且在<LinearLayout>标签中android:orientation属性值设置为horization.然后在<LinearLayout>标签中放置多个控件,如果<LinearLayout>标签中的控件所占的总宽度超出屏幕的宽度,就会出现滚动效果. <Lin

Android中如何实现多行、水平滚动的分页的Gridview?

功能要求: (1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接). 如果单行水平滚动,可以用Horizontalscrollview实现. 如果是多行水平滚动,则结合Gridview(一般是垂直滚动的)和Horizontalscrollview实现. (2)水平滚动翻页,下面有显示当前页的icon. 1.      实现自定义的HorizontalScrollView(HorizontalScrollView.java): 因为要翻页时需要传当前页给调用者,所以flin

产品图片无缝水平滚动效果代码

产品图片无缝水平滚动效果代码:在众多的网站都有这样的效果,那就是产品图片可以不间断的无缝滚动,效果挺美观的,也给静态的页面增加了几分动感,也便利了浏览者查看产品,算是比较好的效果吧,下面就介绍一下如何实现此特效的,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http: