ListView 头部ViewPager广告轮询图效果
来源:互联网 发布:禁止系统安装软件 编辑:程序博客网 时间:2024/05/16 14:53
我的listview头部加banner不是这样做得,在项目中遇到滑动banner图时不流畅,会出现卡顿,思考了下可能是冲突问题,这篇文章给了点思路,已解决。
之前看了别人的一些软件,发现其广告图轮询的时候,那个广告感觉和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;
- }
- }
- 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);
- }
- }
- }
- 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;
- }
- }
- }
上面有些是在别的地方看到的,很久了,忘记在哪里看到的了,就写不上源地址了,敬请见谅。
0 0
- ListView 头部ViewPager广告轮询图效果
- ListView 头部ViewPager广告轮询图效果
- 共同头部+ViewPager+ListView
- ListView头部添加ViewPager
- ListView头部视差效果
- (二)使用ListView嵌套ViewPager实现广告效果和信息列表效果
- Android ListView头部悬浮效果
- ListView实现头部悬停效果
- ListView悬浮头部展示效果
- ViewPager 自动切换广告效果
- Android之ListView头部添加ViewPager
- 横向头部导航+ViewPager+fragment切换效果
- ListView嵌套viewpager 头部图片轮换,listview 进行下拉刷新
- Android ListView 头部缩小放大的效果
- listview scrollview 头部下拉放大效果
- ListView的头部视差效果的实现
- Listview 头部悬停效果的实现
- Android 中ListView悬浮头部效果设置
- 第十四周项目 阅读程序 3
- [sql2008错误问题] RegisteredServerException 异常
- Windows下Apache以FastCGI模式运行PHP
- 2016SDAU编程练习三1007
- 2016-5-29:实验室第四天
- ListView 头部ViewPager广告轮询图效果
- NumPy 数组组合分割
- 苹果Swift编程语言入门教程【中文版】
- c++11笔记
- use makefile on android-linux
- 集合类的简介
- PopupWindow设置其他Activity变暗的效果
- 输出响应的数据给客户端并结束请求,继续执行后面的代码
- Leetcode - 14. Longest Common Prefix