Android 使用ViewPager实现左右循环滑动图片

Android 使用ViewPager实现左右循环滑动图片ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵1.  首先看一些layout下的xml

大家好,又见面了,我是你们的朋友全栈君。

ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵

Android 使用ViewPager实现左右循环滑动图片

1.    首先看一些layout下的xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
   <android.support.v4.view.ViewPager  
        android:id="@+id/viewPager"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content" /> 
        
    <RelativeLayout  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content" 
        android:orientation="vertical" >  
  
        <LinearLayout  
            android:id="@+id/viewGroup"  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:layout_alignParentBottom="true" 
            android:layout_marginBottom="30dp"  
            android:gravity="center_horizontal"  
            android:orientation="horizontal" >  
        </LinearLayout>  
    </RelativeLayout>  

</FrameLayout>

使用ViewPager首先需要引入android-support-v4.jar这个jar包。自己不要忘记加

package com.example.viewpagerdemo;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class TwoActivity extends Activity implements OnPageChangeListener{
	/**
	 * ViewPager
	 */
	private ViewPager viewPager;
	
	/**
	 * 装点点的ImageView数组
	 */
	private ImageView[] tips;
	
	/**
	 * 装ImageView数组
	 */
	private ImageView[] mImageViews;
	
	/**
	 * 图片资源id
	 */
	private int[] imgIdArray ;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ViewGroup group = (ViewGroup)findViewById(R.id.viewGroup);
		viewPager = (ViewPager) findViewById(R.id.viewPager);
		
		//载入图片资源ID
		imgIdArray = new int[]{R.drawable.item01, R.drawable.item02, R.drawable.item03, R.drawable.item04,
				R.drawable.item05,R.drawable.item06, R.drawable.item07, R.drawable.item08};
		
		
		//将点点加入到ViewGroup中
		tips = new ImageView[imgIdArray.length];
		for(int i=0; i<tips.length; i++){
			ImageView imageView = new ImageView(this);
	    	imageView.setLayoutParams(new LayoutParams(10,10));
	    	tips[i] = imageView;
	    	if(i == 0){
	    		tips[i].setBackgroundResource(R.drawable.page_indicator_focused);
	    	}else{
	    		tips[i].setBackgroundResource(R.drawable.page_indicator_unfocused);
	    	}
	    	
	    	LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,  
                    LayoutParams.WRAP_CONTENT));
	    	layoutParams.leftMargin = 5;
	    	layoutParams.rightMargin = 5;
	    	group.addView(imageView, layoutParams);
		}
		
		
		//将图片装载到数组中
		mImageViews = new ImageView[imgIdArray.length];
		for(int i=0; i<mImageViews.length; i++){
			ImageView imageView = new ImageView(this);
			mImageViews[i] = imageView;
			imageView.setBackgroundResource(imgIdArray[i]);
		}
		
		//设置Adapter
		viewPager.setAdapter(new MyAdapter());
		//设置监听,主要是设置点点的背景
		viewPager.setOnPageChangeListener(this);
		//设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动
		viewPager.setCurrentItem((mImageViews.length) * 100);
		
	}
	
	/**
	 * 
	 * @author xiaanming
	 *
	 */
	public class MyAdapter extends PagerAdapter{

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

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;
		}

		@Override
		public void destroyItem(View container, int position, Object object) {
			((ViewPager)container).removeView(mImageViews[position % mImageViews.length]);
			
		}

		/**
		 * 载入图片进去,用当前的position 除以 图片数组长度取余数是关键
		 */
		@Override
		public Object instantiateItem(View container, int position) {
			((ViewPager)container).addView(mImageViews[position % mImageViews.length], 0);
			return mImageViews[position % mImageViews.length];
		}
		
		
		
	}

	@Override
	public void onPageScrollStateChanged(int arg0) {
		
	}

	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {
		
	}

	@Override
	public void onPageSelected(int arg0) {
		setImageBackground(arg0 % mImageViews.length);
	}
	
	/**
	 * 设置选中的tip的背景
	 * @param selectItems
	 */
	private void setImageBackground(int selectItems){
		for(int i=0; i<tips.length; i++){
			if(i == selectItems){
				tips[i].setBackgroundResource(R.drawable.page_indicator_focused);
			}else{
				tips[i].setBackgroundResource(R.drawable.page_indicator_unfocused);
			}
		}
	}

}

代码下载

上面的代码中,当只有3张图片或者2张图片的时候,滑动存在BUG问题的修改如下

  • destroyItem(View container, int position, Object object)方法中不removeView

	@Override
		public void destroyItem(View container, int position, Object object) {
//			((ViewPager)container).removeView(mImageViews[position % mImageViews.length]);
		}

  • instantiateItem(View container, int position)增加异常扑捉

	@Override
		public Object instantiateItem(View container, int position) {
			try {  
				((ViewPager)container).addView(mImageViews[position % mImageViews.length], 0);
			}catch(Exception e){
				//handler something
			}
			return mImageViews[position % mImageViews.length];
		}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163205.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BigDecimal除法问题

    BigDecimal除法问题BigDecimal做除法时,尽量使用divide(BigDecimaldivisor,intscale,introundingMode),这个方法divisor:被除数  scale保留小数位数  roundingMode保留小数时采用的方法,一般使用BigDecimal.ROUND_UP(四舍五入)如果不指定保留小数位数,在遇到除不尽的情况下就会报错BigDecimal源码:…

    2022年6月15日
    33
  • 浏览器插件开发-manifest文件解读「建议收藏」

    浏览器插件开发-manifest文件解读调研资料manifest.json官方文档ChromeExtensionAPI360浏览器的插件文档中文,虽然内核差不多但是不一定与Chromeapi一致,可以作为参考Chrome官方案例库案例如何实现网页和Chrome插件之间的通信消息传递manifest.json配置说明manifest.json用于描述…

    2022年4月11日
    288
  • vscode css自动补全_vscode怎么运行html文件

    vscode css自动补全_vscode怎么运行html文件当我vscode新建html文件时,用!+table键结果发现毫无反应?嗯???[/手动黑人问号]万能的某度来了>>>>>>>>>>>>>>>>>第一步:进入设置界面,搜索seting.json第二步:配置seting.json文件: “emmet.trigg…

    2022年8月22日
    4
  • 在eclipse中没有server(需在选项中设置)

    Eclipse中没有Server选项,需要加载插件。步骤如下:①在软件eclipse下的Help-&gt;InstallNewSoftware-&gt;中,在Workwith中点击Add,如下,加入Name:KeplerLocation:http://download.eclipse.org/releases/kepler②找到选项Web,XML,JavaEEan…

    2022年4月10日
    208
  • 单据保存后的存储过程称为_原始单据保存多少年

    单据保存后的存储过程称为_原始单据保存多少年(一)报关单证保存后的存储过程更新T_modulelist的StorageProductAfterSave值UPDATET_ModuleListSETStorageProductAfterSave=‘SaveInvoiceAfter’wheremodulename=‘报关单证’2.创建存储过程CREATEPROCSaveInvoiceAfter(@InvoiceNumvarchar(30))AsBegin…写你的逻辑,其中参数@InvoiceNum是单据号end(二)出

    2022年9月21日
    2
  • 我的世界服务器显示标指令,我的世界服务器指令|我的世界服务器指令大全「建议收藏」

    我的世界服务器显示标指令,我的世界服务器指令|我的世界服务器指令大全「建议收藏」一砖一瓦一世界,这里是uc129我的世界专区。做为有着极高自由度的3d沙盘游戏我的世界来说,带给玩家的不止是视觉上的享受,通过自己的努力打造属于自己的游戏王国,则是游戏的魅力所在。对于minecraft服务器管理员来说,熟练掌握我的世界服务器指令是至关重要的。如果辛辛苦苦建立好服务器却发现对我的世界服务器指令根本就不了解,这是何等的杯具。接下来uc129小编将给大家分享一些服务器指令方面的内容,我…

    2022年9月23日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号