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 的重用!



  • 相关阅读:
    Haskell Interactive Development in Emacs
    Access Java API in Groovy Script
    手工设置Eclipse文本编辑器的配色
    Color Theme of Emacs
    Gnucash的投资记录
    Special Forms and Syntax Sugars in Clojure
    Use w3m as Web Browser
    SSE指令集加速之 I420转BGR24
    【图像处理】 增加程序速度的方法
    TBB 入门笔记
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7105144.html
Copyright © 2011-2022 走看看