zoukankan      html  css  js  c++  java
  • Android 怎样实现 焦点图的 无线循环滑动的状态?



    參考网址:http://my.oschina.net/xsk/blog/119167

    总体的架构:ViewPgaer 中直接嵌套  IamgeView

    方案一:  重写Viewpager 这样有局限性。 这里的案例是 本地静态的图像

    原本的实现原理: 这里是一种模拟方式 实现的 “无线的循环”。 事实上并非 真正意义上的无线循环。 而是 设置的值非常大,用于 当做 无线循环。

    设置默认选中的非常大的值:

     viewPager.setCurrentItem(100000 * imageResId.length);


    在 PagerAdapter  初始化的方法中: 仅仅须要  创建一个 ImageView  就可以!


    代码:

    package stu.hades;
    
    import android.content.Context;
    import android.support.v4.view.ViewPager;
    import android.util.AttributeSet;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.RelativeLayout;
    
    import com.example.hadesviewpagerdemo.R;
    
    public class MyViewPager extends ViewPager {
    	
    	 protected Context mContext = null;
    	 protected ViewPager viewPager = null;
    
    	    //1、定义图片资源数组。有几个就写几个。也能够动态填充
    	 public static int[] imageResId = new int[] {R.drawable.aaa,R.drawable.aab, R.drawable.aac,R.drawable.aad};
    
    	    //2、初始化一些參数
    	 public MyViewPager(Context context, AttributeSet attrs) {
    	        super(context, attrs);
    	        this.mContext = context;
    	        viewPager = this;
    	 }
    	 
    	//3、视图初始化后配置适配器和监听
    	    @Override
    	    protected void onFinishInflate() {
    	        super.onFinishInflate();
    	        viewPager.setAdapter(new MyAdapter(mContext));
    	        //设定启发位置,设这么大。以便能够左循环100000次,应该没有人滑动这么频繁吧!
    	        viewPager.setCurrentItem(100000 * imageResId.length);
    	        viewPager.setOnPageChangeListener(new MyPageChangeListener());
    	    }
    
    	    //3、图片更改监听器
    	    private class MyPageChangeListener implements OnPageChangeListener {
    	    	
    	        protected int oldPosition = 0;
    
    	        //以下里是显示当前图片位置的圈圈,这里是个參考,大家能够自己写,即便凝视不影响滑动
    	        public void onPageSelected(int position) {
    //	            LinearLayout image_viewpager_circle = (LinearLayout) ((RelativeLayout) viewPager.getParent()).findViewById(R.id.main_image_viewpager_circle);
    //	            ((ImageView) image_viewpager_circle.getChildAt(oldPosition)).setImageResource(R.drawable.dot_normal);
    //	            ((ImageView) image_viewpager_circle.getChildAt(position% imageResId.length)).setImageResource(R.drawable.dot_focused);
    	            oldPosition = position % imageResId.length;
    	        }
    
    	        public void onPageScrollStateChanged(int arg0) {
    
    	        }
    
    	        public void onPageScrolled(int arg0, float arg1, int arg2) {
    
    	        }
    	    }
    
    	    @Override
    	    protected void onMeasure(int arg0, int arg1) {
    	        super.onMeasure(arg0, arg1);
    	    }
    	
    }
    


    2  adapter

    package stu.hades;
    
    import android.content.Context;
    import android.os.Parcelable;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.view.View;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.ImageView;
    
    public class MyAdapter extends PagerAdapter {
    
    	public Context mContext;
    
    	public MyAdapter(Context mContext) {
    		this.mContext = mContext;
    	}
    
    	// 给适配设定元素数最大值,能够无限右滑动,左滑动不能超过100000次
    	@Override
    	public int getCount() {
    		return Integer.MAX_VALUE;
    	}
    
    	@Override
    	public int getItemPosition(Object object) {
    		// TODO Auto-generated method stub
    		return super.getItemPosition(object);
    	}
    
    	// 这个大家都懂的,使用方法能够百度或者OSCHINA一下,我白话文:每次初始化当前视图和左右两側的视图
    	@Override
    	public Object instantiateItem(View arg0, int position) {
    		// TODO Auto-generated method stub
    		int posi = position % MyViewPager.imageResId.length;
    
    		// 每次加入新视图,尽管有点耗资源。但不会有冲突,而且在视图切换过程中。会销毁没用的视图。

    ImageView xImageView = new ImageView(mContext); xImageView.setBackgroundResource(MyViewPager.imageResId[posi]); android.view.ViewGroup.LayoutParams para = new android.view.ViewGroup.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); xImageView.setAdjustViewBounds(true); xImageView.setLayoutParams(para); ((ViewPager) arg0).addView(xImageView, 0); return xImageView; } @Override public void destroyItem(View arg0, int position, Object arg2) { // 销毁不须要的视图 ((ViewPager) arg0).removeView((View) arg2); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { } @Override public void finishUpdate(View arg0) { } }


    代码网址:http://pan.baidu.com/s/1pJMDVMb


    參考方案 二:  不重写 VIewpager 

        直接使用Viewpager, 可是 一样须要设置 VIewpager.setCurrentItem();


    注意:  非常重要的一点 VIewpager 中  ImageView 的重用问题。 不要每一都创建非常麻烦。

    VIewPgaer重用: 自己再往搜一下, 原理非常easy。就是讲ImageView放到 集合中。 通通过 add(ImageView)   remove() 实现 ImageView 的重用!



  • 相关阅读:
    pycharm的list的应用
    pycharm的list中copy的应用
    pycharm的list中clear的应用
    pycharm的list中append的应用
    crontab 管理指定用户的定时任务
    vsftp 搭建及虚拟账号配置
    MySQL 主从配置
    Ant 学习及常用任务
    ansible 小试
    微信H5页面分享
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7105144.html
Copyright © 2011-2022 走看看