Android编程实现ListView头部ViewPager广告轮询图效果

 更新时间:2015年10月26日 14:25:55   作者:freesonhp  
这篇文章主要介绍了Android编程实现ListView头部ViewPager广告轮询图效果,较为详细的分析了自定义ListView实现ViewPager广告图轮询的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了Android编程实现ListView头部ViewPager广告轮询图效果。分享给大家供大家参考,具体如下:

之前看了别人的一些软件,发现其广告图轮询的时候,那个广告感觉和ViewPager的效果不太一样,后来也查了一下,是因为时间问题,找了一些资料,自己也实践一下。

1、为了解决ListView头部加ViewPager滑动冲突问题,必须自定义ListView,重写里面的onInterceptTouchEvent方法,ListView代码如下:

package com.example.testa; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.widget.ListView; 
public class DefinedListView extends ListView { 
 public DefinedListView(Context context) { 
  super(context); 
 } 
 public DefinedListView(Context context, AttributeSet attrs) { 
  super(context, attrs); 
 } 
 public DefinedListView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle); 
 } 
 private float xDistance, yDistance, xLast, yLast; 
 @Override 
 public boolean onInterceptTouchEvent(MotionEvent ev) { 
  switch (ev.getAction()) { 
   case MotionEvent.ACTION_DOWN: 
    xDistance = yDistance = 0f; 
    xLast = ev.getX(); 
    yLast = ev.getY(); 
    break; 
   case MotionEvent.ACTION_MOVE: 
    final float curX = ev.getX(); 
    final float curY = ev.getY(); 
    xDistance += Math.abs(curX - xLast); 
    yDistance += Math.abs(curY - yLast); 
    xLast = curX; 
    yLast = curY; 
    if (xDistance > yDistance) { 
     return false; 
    } 
  } 
  return super.onInterceptTouchEvent(ev); 
 } 
}

2、为了让广告轮询的速度减慢,必须重新设置ViewPager的Scroller,自定义的Scroller如下:

package com.example.testa; 
import java.lang.reflect.Field; 
import android.annotation.SuppressLint; 
import android.content.Context; 
import android.os.Handler; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.animation.Interpolator; 
import android.widget.Scroller; 
public class DefinedScroller extends Scroller { 
 private int DURATION_TIME = 1000; 
 private boolean shouldAutoScroll = true; 
 private ViewPager viewPager = null; 
 @SuppressLint("HandlerLeak") 
 private final Handler handler = new Handler() { 
  public void handleMessage(android.os.Message msg) { 
   if (shouldAutoScroll) { 
    viewPager.setCurrentItem(viewPager.getCurrentItem() + 1); 
    handler.sendEmptyMessageDelayed(0, 2000); 
   } 
  }; 
 }; 
 public DefinedScroller(Context context) { 
  super(context); 
 } 
 public DefinedScroller(Context context, Interpolator interpolator) { 
  super(context, interpolator); 
 } 
 private View initViewPager(Context context) { 
  View view = LayoutInflater.from(context).inflate(R.layout.view_pager_layout, null);
  this.viewPager = (ViewPager) view.findViewById(R.id.viewpager);
  this.viewPager.setOffscreenPageLimit(2); 
  this.viewPager.setAdapter(new MyFragmentPagerAdapter(((FragmentActivity) context).getSupportFragmentManager())); 
  return view; 
 } 
 public ViewPager getViewPager() { 
  return viewPager; 
 } 
 public View initView(Context context) { 
  View view = initViewPager(context); 
  this.viewPager.setOnTouchListener(new OnTouchListener() { 
   @Override 
   public boolean onTouch(View v, MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_UP) { 
     shouldAutoScroll = true; 
     handler.sendEmptyMessageDelayed(0, 2000); 
    } else { 
     handler.removeMessages(0); 
     shouldAutoScroll = false; 
    } 
    return false; 
   } 
  }); 
  try { 
   Field mScroller = ViewPager.class.getDeclaredField("mScroller"); 
   mScroller.setAccessible(true); 
   mScroller.set(viewPager, this); 
  } catch (NoSuchFieldException e) { 
  } catch (IllegalArgumentException e) { 
  } catch (IllegalAccessException e) { 
  } 
  handler.sendEmptyMessageDelayed(0, 2000); 
  return view; 
 } 
 public void setShouldAutoScroll() { 
  handler.removeMessages(0); 
  if (viewPager.isShown()) { 
   shouldAutoScroll = true; 
   handler.sendEmptyMessageDelayed(0, 2000); 
  } else { 
   shouldAutoScroll = false; 
  } 
 } 
 @Override 
 public void startScroll(int startX, int startY, int dx, int dy, int duration) { 
  super.startScroll(startX, startY, dx, dy, shouldAutoScroll ? DURATION_TIME : duration); 
 } 
}

关键是startScroll方法啦

3、其他测试类,

(1)TestFragment:

package com.example.testa; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
public class TestFragment extends Fragment { 
 public int imageResource = 0; 
 public static TestFragment newInstance(int imageResource) { 
  TestFragment newFragment = new TestFragment(); 
  newFragment.imageResource = imageResource; 
  return newFragment; 
 } 
 @Override 
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
  View view = inflater.inflate(R.layout.pager_layout, null); 
  ImageView textView = (ImageView) view.findViewById(R.id.image); 
  textView.setImageResource(imageResource); 
  return view; 
 } 
}

(2)ViewPager的Adapter类:

package com.example.testa; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter { 
 public MyFragmentPagerAdapter(FragmentManager fm) { 
  super(fm); 
 } 
 @Override 
 public int getCount() { 
  return Integer.MAX_VALUE; 
 } 
 @Override 
 public Fragment getItem(int arg0) { 
  switch (arg0 % 4) { 
   case 0: 
    return TestFragment.newInstance(R.drawable.a1); 
   case 1: 
    return TestFragment.newInstance(R.drawable.default_wh); 
   case 2: 
    return TestFragment.newInstance(R.drawable.default_ww); 
   case 3: 
    return TestFragment.newInstance(R.drawable.test); 
   default: 
    return TestFragment.newInstance(R.drawable.a1); 
  } 
 } 
}

(3)测试的Activity:

package com.example.testa; 
import java.util.ArrayList; 
import java.util.List; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AbsListView; 
import android.widget.AbsListView.OnScrollListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 
public class MainActivity extends FragmentActivity { 
 private DefinedListView listView = null; 
 private List<String> list = null; 
 private DefinedScroller definedScroller = null; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  listView = (DefinedListView) findViewById(R.id.listview); 
  initListData(); 
  initViewPager(); 
  listView.setAdapter(new ListAdapter()); 
  listView.setOnItemClickListener(new OnItemClickListener() { 
   @Override 
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    definedScroller.getViewPager().setCurrentItem(definedScroller.getViewPager().getCurrentItem() + 1); 
   } 
  }); 
  listView.setOnScrollListener(new OnScrollListener() { 
   @Override 
   public void onScrollStateChanged(AbsListView view, int scrollState) { 
    if (scrollState == SCROLL_STATE_IDLE) { 
     definedScroller.setShouldAutoScroll(); 
    } 
   } 
   @Override 
   public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
   } 
  }); 
 } 
 private void initListData() { 
  list = new ArrayList<String>(); 
  for (int i = 1; i <= 20; ++i) { 
   list.add("test" + i); 
  } 
 } 
 private void initViewPager() { 
  definedScroller = new DefinedScroller(this); 
  listView.addHeaderView(definedScroller.initView(this)); 
 } 
 private class ListAdapter extends BaseAdapter { 
  @Override 
  public int getCount() { 
   return list.size(); 
  } 
  @Override 
  public Object getItem(int position) { 
   return list.get(position); 
  } 
  @Override 
  public long getItemId(int position) { 
   return position; 
  } 
  @Override 
  public View getView(int position, View convertView, ViewGroup parent) {
   TextView textView = (TextView) LayoutInflater.from(MainActivity.this).inflate(R.layout.text_view_layout, 
     null); 
   textView.setPadding(20, 20, 20, 20); 
   textView.setText(list.get(position)); 
   return textView; 
  } 
 } 
}

4、布局文件就算了吧

上面有些是在别的地方看到的,很久了,忘记在哪里看到的了,就写不上源地址了,敬请见谅。

希望本文所述对大家Android程序设计有所帮助。

相关文章

  • 安卓(Android)ListView 显示图片文字

    安卓(Android)ListView 显示图片文字

    本文主要介绍Android中重要组件ListView,在编程中经常会用到ListView 显示图片和文字,这里给大家一个小例子,希望能帮助有需要的同学
    2016-07-07
  • Flutter音乐播放插件audioplayers使用步骤详解

    Flutter音乐播放插件audioplayers使用步骤详解

    audioplayers是一个可以支持同时播放多个音频文件的Flutter的插件,可以播放多个同时的音频文件,这篇文章主要介绍了audioplayers的使用步骤,感兴趣想要详细了解可以参考下文
    2023-05-05
  • Android自定义view实现日历打卡签到

    Android自定义view实现日历打卡签到

    这篇文章主要为大家详细介绍了Android自定义view实现日历打卡签到,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Android编程实现GridView控件点击图片变暗效果的方法

    Android编程实现GridView控件点击图片变暗效果的方法

    这篇文章主要介绍了Android编程实现GridView控件点击图片变暗效果的方法,简单分析了GridView控件事件响应及属性操作的相关技巧,需要的朋友可以参考下
    2017-06-06
  • Android 使用XML做动画UI的深入解析

    Android 使用XML做动画UI的深入解析

    在Android应用程序,使用动画效果,能带给用户更好的感觉。做动画可以通过XML或Android代码。本教程中,介绍使用XML来做动画。在这里,介绍基本的动画,如淡入,淡出,旋转等,需要的朋友可以参考下
    2013-07-07
  • Android-屏幕适配需要注意的地方总结

    Android-屏幕适配需要注意的地方总结

    需要注意一下几个地方:尽量使用线性布局/尽量使用dip和sp,不要使用px/为不同的分辨率提供不同的布局文件和图片,接下来为你详细介绍下,感兴趣的你可以参考下哈,希望可以帮助到你
    2013-03-03
  • Android 嵌套 Intent 隐患及解决方案

    Android 嵌套 Intent 隐患及解决方案

    这篇文章主要介绍了Android嵌套Intent隐患及解决方案,文章围绕主题展开详细的内容介绍,具有一定的参考价值需要的小伙伴可以参考一下
    2022-05-05
  • 一步步实现Viewpager卡片翻页效果

    一步步实现Viewpager卡片翻页效果

    一步步实现Viewpager卡片翻页效果,文章很精彩,实现步骤很详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 简单实现Android文件上传

    简单实现Android文件上传

    这篇文章主要为大家详细介绍了如何简单实现Android文件上传的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Flutter路由的几种用法小结

    Flutter路由的几种用法小结

    这篇文章主要介绍了Flutter路由的几种用法,包括基本路由跳转和路由跳转传参方法,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-12-12

最新评论