ViewPager 滑动页(二)

需求:滑动展示页,能够使用本地数据,及获取服务器数据进行刷新操作,并实现页面自动切换;

效果图:

实现分析:

1.目录结构:

代码实现:

1.PosterView.java

package com.jjc.demo;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class PosterView extends FrameLayout{

    private Context context;
    private ViewPager viewPager;
    private LinearLayout container;

    private PosterAdapter adapter;

    private List<Integer> posterList = new ArrayList<Integer>();

    private ImageView imageView;
    // 底部小点的图片
    private ImageView[] points;

    // 记录当前选中位置
    private int currentIndex = 0;
    private int nextIndex;
    private int pageNum = 1;

    private Handler handler = new Handler(Looper.getMainLooper()) {

        @Override
        public void handleMessage(Message msg) {
            if (points!= null && points.length >0) {
                nextIndex = (currentIndex + 1) % points.length;
                // 设置当前页面
                setCurDot(nextIndex);
                setCurView(nextIndex);
                handler.removeMessages(0);
                handler.sendEmptyMessageDelayed(0, 5000);
            }

        }
    };

    public PosterView(Context context) {
        this(context, null);
    }

    public PosterView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        LayoutInflater.from(context).inflate(R.layout.view_poster, this, true);
        initView();
    }

    @Override
    protected void onDetachedFromWindow(){
        handler.removeMessages(0);
        super.onDetachedFromWindow();
    }

    private void initView(){
        container = (LinearLayout) findViewById(R.id.container);
        viewPager = (ViewPager)findViewById(R.id.viewpager);
        viewPager.setOnPageChangeListener(new viewpagerListener());

        adapter = new PosterAdapter(context, posterList);
        viewPager.setAdapter(adapter);

    }

    /**
     * 刷新海报页数据;
     * @param list
     */
    public void refreshData(List<Integer> list){
        if(list == null || list.isEmpty()){
            return;
        }
        initPoint(list.size());

        posterList.clear();
        posterList.addAll(list);
        adapter.notifyDataSetChanged();

        handler.removeMessages(0);
        handler.sendEmptyMessageDelayed(0, 5000);
    }

    private void initPoint(int num){
        pageNum = num;
        container.removeAllViews();

        if(num == 0){
            return;
        }

        points = new ImageView[num];
        for (int i = 0; i < num; i++) {
            imageView = new ImageView(context);
            imageView.setBackgroundResource(R.drawable.poster_point_selector);

            LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(12, 12);
            mLayoutParams.rightMargin = 8;
            mLayoutParams.leftMargin = 8;
            mLayoutParams.topMargin = 24;
            mLayoutParams.bottomMargin = 28;

            points[i] = imageView;
            // 设置位置tag,方便取出与当前位置对应
            points[i].setTag(i);
            // 默认都设为灰色
            points[i].setEnabled(false);
            // 给每个小点设置监听
            points[i].setOnClickListener(new pointListener());
            container.addView(points[i], mLayoutParams);
        }
        // 设置为白色,即选中状态
        points[currentIndex].setEnabled(true);
    }

    private class viewpagerListener implements OnPageChangeListener {

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageSelected(int position) {
            // 设置底部小点选中状态
            setCurDot(position);
        }
    }

    private class pointListener implements OnClickListener {

        @Override
        public void onClick(View v) {
            int position = (Integer) v.getTag();
            setCurView(position);
            setCurDot(position);
        }
    }

    /**
     * 设置当前页面的位置
     */
    private void setCurView(int position) {
        if (position < 0 || position >= pageNum) {
            return;
        }
        viewPager.setCurrentItem(position);
    }

    /**
     * 设置当前的小点的位置
     */
    private void setCurDot(int positon) {
        if (positon < 0 || positon > pageNum - 1 || currentIndex == positon) {
            return;
        }
        points[positon].setEnabled(true);
        points[currentIndex].setEnabled(false);
        currentIndex = positon;
    }

}

项目总结:

  对于页面动态切换,采用handle进行切换;

代码:http://pan.baidu.com/s/1jJH1O

时间: 2024-10-12 08:06:05

ViewPager 滑动页(二)的相关文章

Android 快速实现 ViewPager 滑动页卡切换(可用作整个 app上导航)

我记得在前面,我写了一篇Android 微信6.1 tab栏图标和字体颜色渐变的实现,如果大家仅仅认为这篇文章的功能只是模仿微信颜色渐变效果,那就大错特错了!认真阅读了这篇文章的朋友,应该知道,这里面代码可用作 app 通用的底部栏导航,通过它能快速的实现类似微信6.0版本以底部导航的 app 整体架构,并且在 MainActivity 中需要编写的代码非常简洁.如果有兴趣的朋友可以去看看. 效果: 今天这篇 blog的内容同样可以拿来做 app 的整体架构,但与前面那篇 blog 不同,不同之

ViewPager 滑动页(一)

需求:滑动展示页,能够使用本地数据,及获取服务器数据进行刷新操作: 效果图: 实现分析: 1.目录结构: 代码实现: 1.fragment_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="matc

ViewPager 滑动页(三)

需求:滑动展示页,能够使用本地数据,及获取服务器数据进行刷新操作,当滑动到最后一页时,结束当前activity,进入下一个activity: 效果图: 实现分析: 1.目录结构: 代码实现: 1.PosterView.java package com.jjc.demo; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; im

(转)ViewPager,ScrollView 嵌套ViewPager滑动冲突解决

ViewPager,ScrollView 嵌套ViewPager滑动冲突解决 本篇主要讲解一下几个问题 粗略地介绍一下View的事件分发机制 解决事件滑动冲突的思路及方法 ScrollView 里面嵌套ViewPager导致的滑动冲突 ViewPager里面嵌套ViewPager 导致的滑动冲突 轮播图的几种实现方式 先看一下效果图 ScrollView里面嵌套ViewPager ViewPager里面嵌套ViewPager View的 事件分发机制 这篇博客大打算详细讲解View的事件分发机制

viewpager滑动button按钮选项卡跟着变动颜色

package com.example.day8viewpager; import java.util.ArrayList;import java.util.List; import android.os.Bundle; import android.app.Activity;import android.graphics.Color;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager

ViewPager实现页卡的3种方法(谷歌组件)

----方法一:---- 效果图: 须要的组件: ViewPager+PagerTabStrip 布局文件代码: <!--xmlns:android_custom="http://schemas.android.com/apk/res/com.pengkv.bigo"--> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layou

PullToRefreshListView中嵌套ViewPager滑动冲突的解决

PullToRefreshListView中嵌套ViewPager滑动冲突的解决 最近恰好遇到PullToRefreshListView中需要嵌套ViewPager的情况,ViewPager 作为头部添加到ListView中,发先ViewPager在滑动过程中流畅性太差几乎很难左右滑动.在网上也看了很多大神的介绍,看了ViewPager的源码.其实思路很简单,只不过没有看到有教完整的说明,为了帮转像我这样的green hand 少走弯路,将过程整理下.大神自动略过~_~: 滑动冲突的解决大概要处

ViewPager滑动监听的参数解释

viewpager.setOnPageChangeListener (new OnPageChangeListener() { @Override public void onPageSelected(int select) { // TODO Auto-generated method stub Log. d( "dml", "onPageSelected:::::select ============ " + select) ; } @Override publ

ViewPager滑动不畅及灵敏度的问题

在项目中用到了Android的ViewPager组件,但是发现在滑动的时候不是特别流畅,有些小的滑动无法响应,于是考虑进行优化. 一开始考虑修改ViewPager中的一些参数,比如mTouchSlop等参数,继承ViewPager并且重写一些方法: 但是后来发现这种方法比较复杂,并且滑动不流畅的问题好像不在这里. 最后问题定位到ViewPager的嵌套上,因为在ViewPager所包含的view中包含了GridView组件,因此在滑动的时候有一定几率touch事件会被GridView处理掉,从而