热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要介绍了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 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<&#63;> 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(); 
  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程序设计有所帮助。


推荐阅读
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 原理:dismiss再弹出,把dialog设为全局对象。if(dialog!null&&dialog.isShowing()&&!(Activity.)isFinishing()) ... [详细]
  • 本文详细介绍了在Centos7上部署安装zabbix5.0的步骤和注意事项,包括准备工作、获取所需的yum源、关闭防火墙和SELINUX等。提供了一步一步的操作指南,帮助读者顺利完成安装过程。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 本文介绍了使用SSH免密登录的步骤,包括生成公私钥、传递公钥给被登录机、修改文件权限的操作。同时提醒用户注意私钥的传递方式,建议使用U盘等离线方式传递。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • GSIOpenSSH PAM_USER 安全绕过漏洞
    漏洞名称:GSI-OpenSSHPAM_USER安全绕过漏洞CNNVD编号:CNNVD-201304-097发布时间:2013-04-09 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • linux 禁止指定ip访问
    linux中如何禁止指定的ip访问呢?比如被别人暴力破解,被别人使用不同的密码尝试登录:所以我想直接禁用这些ip的访问.怎么办呢?解决方案:修改配置文件etchosts.deny把 ... [详细]
author-avatar
手机用户2502892647
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有