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 的重用!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步