基于ViewPager的自动轮播模块–解决与ScrollView冲突问题
来源:互联网 发布:photoshop盖印图层 mac 编辑:程序博客网 时间:2024/05/22 00:25
在第一次写项目的时候,客户提出了这个需求,所以就在网上查找现成的解决办法。也用过几个别的案例,不过效果都不好,于是就多方结合修改最终完善。
在Activity中加入初始化组件的代码
private void initAutoViewPager() { autoViewPager.isHavaPoint(true); //父控件没有ScrollView时不用设置 autoViewPager.setScrollView(scrollView); //引入数据的格式可以自定义 autoViewPager.setData(list);}
在布局文件中加入
<com.gravin.AutoViewPager android:id="@+id/home_ad" android:layout_width="match_parent" android:layout_height="@dimen/viewpager_height" />
在原有的代码中加入上述代码就可以实现图片轮播的效果了。
核心代码
package com.gravin;import java.util.ArrayList;import java.util.HashMap;import java.util.Timer;import java.util.TimerTask;import android.content.Context;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ScrollView;import android.widget.Toast;/** * 滑动广告 * * @author Gavin * */public class AutoViewPager extends FrameLayout { private Context mContext = null; private boolean isHavaPoint=true; private boolean mIsSwitched = false; //存放子视图 private ArrayList<View> mPageViews = null; private ViewGroup mPointsViewGroup = null; private ViewPager mViewPager = null; private ScrollView mScroll = null; //图片切换间隔 private long time=1000; private GuidePageAdapter mGuidePageAdapter = null; //存放要显示的数据 private ArrayList<HashMap<String, Object>> data = null; private ImageView[] mPointViews = null; private GuidePageChangeListener mGuidePageChangeListener = null; private Timer mTimer = null; public AutoViewPager(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; } public AutoViewPager(Context context) { super(context); mContext = context; } /** * 引入父控件中的ScrollView */ public void setScrollView(ScrollView scrollView) { mScroll = scrollView; } private void init() { LayoutInflater.from(mContext).inflate(R.layout.viewpager, this, true); //用于存放页面指示器的控件 mPointsViewGroup = (ViewGroup) findViewById(R.id.viewpager_PointsLayout); mViewPager = (ViewPager) findViewById(R.id.viewpager_ViewPager); mViewPager.setAdapter(getGuidePageAdapter()); mViewPager.setOnPageChangeListener(getGuidePageChangeListener()); //防止与ScrollView冲突 if (mScroll != null) { mViewPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mIsSwitched=true; mScroll.requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: mIsSwitched=true; mScroll.requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_UP: mScroll.requestDisallowInterceptTouchEvent(false); break; } return false; } }); } mPageViews = new ArrayList<View>(); for (int m = 0; m < data.size(); m++) { View view = LayoutInflater.from(mContext).inflate(R.layout.viewpager_subview, null); //显示图片的ImageView ImageView img = (ImageView) view.findViewById(R.id.viewpager_subview_img); final HashMap<String, Object> map = data.get(m); img.setBackgroundResource(Integer.valueOf(map.get("img").toString())); //ImageLoader.getInstance().displayImage(map.get("pic").toString(),img); view.setClickable(true); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, map.get("img").toString(), Toast.LENGTH_SHORT).show(); } }); mPageViews.add(view); } //及时通知Adapter数据更新 mGuidePageAdapter.notifyDataSetChanged(); if (isHavaPoint) { mPointViews = new ImageView[data.size()]; ViewGroup.MarginLayoutParams mp = new ViewGroup.MarginLayoutParams(15, 15); mp.setMargins(5, 0, 5,0); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mp); for (int i = 0; i < data.size(); i++) { ImageView imageView = new ImageView(mContext); mPointViews[i] = imageView; if (i == 0) { // 默认选中第一张图片 mPointViews[i].setBackgroundResource(R.drawable.page_indicator_focused); } else { mPointViews[i].setBackgroundResource(R.drawable.page_indicator); } mPointsViewGroup.addView(mPointViews[i],params); } } //开始轮播 startTimer(); } /** * 是否显示页面指示器,请在setData之前调用 */ public void isHavaPoint(boolean isHavaPoint){ this.isHavaPoint=isHavaPoint; } /** * 引入数据 * @param data */ public void setData(ArrayList<HashMap<String, Object>> data) { this.data = data; if (data == null || data.size() == 0) { return; } init(); } class GuidePageAdapter extends PagerAdapter { @Override public int getCount() { return mPageViews == null ? 0 : mPageViews.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void destroyItem(ViewGroup arg0, int arg1, Object arg2) { arg0.removeView(mPageViews == null ? null : mPageViews.get(arg1)); } @Override public Object instantiateItem(ViewGroup arg0, int arg1) { arg0.addView(mPageViews == null ? null : mPageViews.get(arg1)); return mPageViews == null ? null : mPageViews.get(arg1); } } class GuidePageChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { if (isHavaPoint) { for (int i = 0; i < mPointViews.length; i++) { mPointViews[arg0].setBackgroundResource(R.drawable.page_indicator_focused); if (arg0 != i) { mPointViews[i].setBackgroundResource(R.drawable.page_indicator); } } } mIsSwitched = true; } } private void startTimer() { if (mTimer == null) { mTimer = new Timer(true); } mTimer.schedule(new TimerTask() { @Override public void run() { mHandler.sendEmptyMessage(0); } }, 1000, time); } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0: if (mIsSwitched) { mIsSwitched = false; } else { int now = mViewPager.getCurrentItem(); int size = mPageViews == null ? 0 : mPageViews.size(); if (now < size - 1) { now++; } else { now = 0; } mViewPager.setCurrentItem(now, true); } } } }; private void stopTimer() { if (mTimer != null) { mTimer.cancel(); mTimer = null; } } //在垃圾回收之前停止计时器 @Override protected void finalize() throws Throwable { stopTimer(); }; private GuidePageAdapter getGuidePageAdapter() { if (mGuidePageAdapter == null) { mGuidePageAdapter = new GuidePageAdapter(); } return mGuidePageAdapter; } private GuidePageChangeListener getGuidePageChangeListener() { if (mGuidePageChangeListener == null) { mGuidePageChangeListener = new GuidePageChangeListener(); } return mGuidePageChangeListener; }}
0 0
- 基于ViewPager的自动轮播模块–解决与ScrollView冲突问题
- 解决viewpager自动轮播速度变快的问题
- Android中给Listview的HeadView加ViewPager自动轮播图,解决滑动冲突
- 自动轮播的viewpager
- ViewPager的自动轮播
- 自动轮播的Viewpager
- ViewPager自动轮播时触摸的方便解决
- viewpager循环滚动和自动轮播的问题
- ViewPager的自动轮播与无限录播
- ViewPager自动轮播
- ViewPager自动轮播
- viewpager自动轮播
- viewpager自动轮播
- 炒鸡好用的自动轮播的ViewPager
- Android 自动轮播的Viewpager
- android之自动轮播的ViewPager
- 自动轮播的viewPager实现
- 内部优化的 自动轮播 Viewpager
- 2009-2010年中国商业智能市场分析报告
- 将字符数组s2中全部字符复制到字符数组s1,不用strcpy(复制时‘\0’也要复制过去‘\0’后面的字符不用复制)
- 笔记 二维数组中的查找
- Android Service 之三(Bind Service, 继承自 Binder 类)
- 工作总结第十五天
- 基于ViewPager的自动轮播模块–解决与ScrollView冲突问题
- java线程同步
- 删除链表中和某一个数相同的元素(单向链表)哈理工oj1546
- 线性表逆置
- Single Number
- cinder 之driver 的实现
- 修改Ubuntu用户名密码
- Android Service 之三(Bind Service,使用 AIDL)
- 求100内出现9的次数