ViewPager轮播效果
来源:互联网 发布:大闹天宫进阶数据 编辑:程序博客网 时间:2024/05/16 12:22
直接贴关键代码。
调用处的代码
indicatorLayout = (LinearLayout) findViewById(R.id.index_indicatorlayout); /*indicatorLayout必须声明在viewpager之前*/ viewPager = new IndexViewPage(mContext,indicatorLayout); ((RelativeLayout)findViewById(R.id.mRelativeLayout_advertise)).addView(viewPager); indicatorLayout.bringToFront();
activity界面关于生命周期处的调用及xml文件布局
<RelativeLayout android:id="@+id/mRelativeLayout_advertise" android:layout_width="fill_parent" android:layout_height="300dp" > <LinearLayout android:id="@+id/index_indicatorlayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="10dp" android:orientation="horizontal" > </LinearLayout> </RelativeLayout>
@Override protected void onResume() { // TODO Auto-generated method stub viewPager.startCarousel(); super.onResume(); } @Override protected void onPause() { // TODO Auto-generated method stub viewPager.stopCarousel(); super.onPause(); } private void setListeners() { // TODO Auto-generated method stub // viewpager设置触摸监听 viewPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if (viewPager.getAdapter().getCount()<=1) { return false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: viewPager.stopCarousel(); break; case MotionEvent.ACTION_UP: viewPager.startCarousel(); } return false; } });}
关键类IndexViewPage
import java.util.ArrayList;import java.util.List;import android.content.Context;import android.os.Handler;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.util.Log;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;/** * @author Lang K * 自定义ViewPager 实现轮播,无限滑动 */public class IndexViewPage extends ViewPager { /** * 数据源 */ private List<View> list; /** * 动态加载view */ private LayoutInflater inflater; /** * 上下文 */ private Context context; /** * 定义静态变量,标识是否 */ private static boolean isDone = true; /** * 定义静态变量,是否启动轮播线程 */ private static boolean ISRUN = true; /** *当前viewpager显示的指针 */ private static int CURRECTPOSTION = 100; /** * 声明线程 */ private MyThread myThread; /** * 定义静态变量,是否处理轮播 */ private static boolean isDoing = true; /** * handler回调CODE */ private static final int HANDLERCODE = 0X10; /** * handler发送延迟,以毫秒计 */ private static final int DELAEDTIME = 5000; private LinearLayout indicatorLayout; /** * 小圆点宽高 */ private static final int DOTWIDTH = 10; private static final int DOTHEIGHT = 10; private static final int DOTMRAGIN = 10; /** * Viewpager适配器 */ MyAdapter adapter; /** * 构造方法 * @param context 上下文 */ public IndexViewPage(Context context,LinearLayout indicatorLayout) { super(context); this.context = context; this.indicatorLayout = indicatorLayout; initView(); } /** * 构造方法 * @param context 上下文 * @param attrs 在xml文件中定义的属性 */ public IndexViewPage(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; initView(); } /** * 初始化ViewPager */ private void initView() { // TODO Auto-generated method stub inflater = LayoutInflater.from(context); /* 模拟数据*/ ArrayList<View> lists = new ArrayList<View>(); View view1 = inflater.inflate(R.layout.index_title_view, null); lists.add(view1); View view2 = inflater.inflate(R.layout.index_title_view, null); ((ImageView)view2.findViewById(R.id.index_title_image)).setImageResource(R.drawable.banner6); lists.add(view2); View view3 = inflater.inflate(R.layout.index_title_view, null); ((ImageView)view3.findViewById(R.id.index_title_image)).setImageResource(R.drawable.banner5); lists.add(view3); adapter = new MyAdapter(); setAdapter(adapter); setListViews(lists); if (list.size()!=1) { setOnPageChangeListener(new PageChangeListener()); initDots(); setCurrentItem(CURRECTPOSTION); }else if(list.size()==1){// this.addView(list.get(0)); } } /** * 初始化小圆点 */ private void initDots() { // TODO Auto-generated method stub for(int i = 0 ;i<list.size();i++){ ImageView imageView = new ImageView(context); imageView.setId(i); imageView.setImageDrawable(getResources().getDrawable(R.drawable.circle_up_bg)); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(DOTWIDTH,DOTHEIGHT); params.leftMargin = DOTMRAGIN; params.rightMargin = DOTMRAGIN; indicatorLayout.addView(imageView, params); } } @Override public void setOnTouchListener(OnTouchListener l) { // TODO Auto-generated method stub super.setOnTouchListener(l); } public List<View> getList() { return list; } public void setList(List<View> list) { this.list = list; } /** * ViewPager发送改变监听 * @author LangK * */ private class PageChangeListener implements OnPageChangeListener{ @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub CURRECTPOSTION = arg0; int postion = arg0 % list.size(); setIndicator(postion); } } /** * 改变底部圆点指针的颜色 * @param postion 当前指针 */ private void setIndicator(int postion){ for(int i=0;i<list.size();i++){ if (i==postion) { ((ImageView)indicatorLayout.getChildAt(i)).setImageDrawable(getResources().getDrawable(R.drawable.circle_down_bg)); }else { ((ImageView)indicatorLayout.getChildAt(i)).setImageDrawable(getResources().getDrawable(R.drawable.circle_up_bg)); } } } /** * Viewpager适配器 * @author LangK * */ private class MyAdapter extends PagerAdapter{ @Override public int getCount() { // TODO Auto-generated method stub if (list==null) { return 0; } if (list.size()<=1) { return 1; }else if (list.size()==2) { return 2; } return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0==arg1; } @Override public Object instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub if (list.get(position % list.size()).getParent() != null) { ((ViewPager) list.get(position % list.size()) .getParent()).removeView(list.get(position % list.size())); } ((ViewPager) container).addView( list.get(position % list.size()), 0); return list.get(position % list.size()); } @Override public void destroyItem(ViewGroup container, int position, Object object) { // TODO Auto-generated method stub } } /** * 主线程的回调函数 */ private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { if (msg.what==HANDLERCODE) { if (isDoing) { isDone = true; CURRECTPOSTION++; Log.d("IndexViewPager", "ViewPager发生改变"); if (list.size()>1) { setCurrentItem(CURRECTPOSTION); } } } } }; /** * 轮播线程 */ private class MyThread extends Thread{ @Override public void run() { // TODO Auto-generated method stub while(ISRUN){ if (isDone) { isDone = false; handler.sendEmptyMessageDelayed(HANDLERCODE,DELAEDTIME); } } } } /** * 停止轮播 */ public void stopCarousel(){ ISRUN = false; isDoing = false; isDone = false; if (handler!=null) { handler.removeMessages(HANDLERCODE); } } /** * 开始轮播 */ public void startCarousel(){ ISRUN = true; isDoing = true; isDone = true; if (myThread==null||!myThread.getState().equals(Thread.State.RUNNABLE)) { myThread = null; myThread = new MyThread(); myThread.start(); } } /** * 拦截触摸事件 */ @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { // TODO Auto-generated method stub if (list.size()>1) { return super.onInterceptTouchEvent(arg0); }else { return false; } } public void setListViews(List<View> list){ this.list = list; adapter.notifyDataSetChanged(); }}
界面中用到的xml文件,图片资源请自行添加
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="fitXY" android:src="@drawable/activity_index_banner" android:id="@+id/index_title_image" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingTop="8dp" android:paddingBottom="8dp" android:background="#88000000" android:layout_alignParentBottom="true" android:layout_marginBottom="15dp" android:textColor="#fff" android:gravity="center" android:text="" android:singleLine="true" android:ellipsize="marquee" android:focusable="true" android:marqueeRepeatLimit="marquee_forever" android:focusableInTouchMode="true" android:scrollHorizontally="true" android:visibility="gone" /> </RelativeLayout></LinearLayout>
0 0
- ViewPager轮播效果
- 自定义ViewPager实现轮播效果
- ViewPager实现广告轮播效果
- viewpager实现简单的轮播效果
- android图片轮播效果viewPager
- CarouselViewPager实现ViewPager的轮播效果
- ViewPager实现广告轮播效果
- ViewPager 3D轮播效果
- android-ViewPager的轮播效果
- ViewPager轮播切换带动画效果
- Android Viewpager实现图片轮播(仿优酷效果)
- Android Viewpager实现图片轮播(仿优酷效果)
- Android开发只ViewPager实现广告轮播效果
- Android 通过ViewPager实现广告轮播效果
- Android之利用Viewpager实现图片的轮播效果
- 巧用ViewPager 打造不一样的广告轮播切换效果
- Android ViewPager之实现轮播广告效果
- 巧用ViewPager 打造不一样的广告轮播切换效果
- Response.Write Table 方式导出Excel 添加样式
- nrf51822 app_timer
- javascript 定时器工作原理
- MFC总结(7)--- 操作Ini文件 操作
- * daemon not running. starting it now * ADB server didn't ACK * failed to start daemon *
- ViewPager轮播效果
- 关于 PreparedStatement 返回值的问题
- Android开发UI之隐藏系统状态栏
- DVR SNAT避免东西向流量的一种方案
- mysql常用doc命令大全
- Xcode 6制作动态及静态Framework
- Android Appium Server从启动到case完成的活动分析
- 主activity报空指针异常java.lang.RuntimeException: Unable to resume activity
- linux 文本相关命令