Android实现实时滑动ViewPager的2种方式

先看看效果图:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.example.welcome.MainActivity" > 

 <android.support.v4.view.ViewPager
 android:id="@+id/mViewPager"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent" /> 

 <FrameLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:layout_alignParentTop="true"
 android:layout_centerHorizontal="true"
 android:layout_marginTop="30dp" > 

 <com.example.welcome.PagerCursor
  android:id="@+id/pagerCursor"
  android:layout_width="fill_parent"
  android:layout_height="5dp" />
 </FrameLayout> 

 <FrameLayout
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignParentBottom="true"
 android:layout_centerHorizontal="true"
 android:layout_marginBottom="30dp" > 

 <com.example.welcome.CustomeDotGroup
  android:id="@+id/ll_point_group"
  android:layout_width="fill_parent"
  android:layout_height="10dp"
  android:orientation="horizontal" >
 </com.example.welcome.CustomeDotGroup> 

 <View
  android:id="@+id/red_point"
  android:layout_width="10dp"
  android:layout_height="10dp"
  android:background="@drawable/point_red" />
 </FrameLayout> 

</RelativeLayout> 

MainActivity

package com.example.welcome; 

import java.util.ArrayList; 

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView; 

public class MainActivity extends Activity {
 private ViewPager mViewPager; 

 MyAdapter mAdapter;
 private ArrayList<ImageView> imageViewList;
 View red_point;
 private int lastDis;
 PagerCursor pagerCursor;
 @SuppressWarnings("deprecation")
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 pagerCursor = (PagerCursor) findViewById(R.id.pagerCursor);
 red_point = findViewById(R.id.red_point);
 imageViewList = new ArrayList<ImageView>();
 int[] imagesInt = {R.drawable.p1,R.drawable.p2,R.drawable.p3};
 for (int i = 0; i < imagesInt.length; i++) {
  ImageView imageView = new ImageView(MainActivity.this);
  imageView.setBackgroundResource(imagesInt[i]);
  imageViewList.add(imageView); 

 }
 mViewPager = (ViewPager) findViewById(R.id.mViewPager); 

 mAdapter = new MyAdapter(); 

 mViewPager.setAdapter(mAdapter); 

 mViewPager.setOnPageChangeListener(new OnPageChangeListener() { 

  private boolean isDragging; 

  @Override
  public void onPageSelected(int arg0) { 

  } 

  @Override
  public void onPageScrolled(int position, float screenOffSet, int arg2) {
  TranslateAnimation animation = null;
  if (isDragging) { 

   int dp2px = PhoneUtils.dp2px(MainActivity.this, 20f);
   int offSet = (int) (position*dp2px + dp2px*screenOffSet); 

   animation = new TranslateAnimation(lastDis, offSet, 0f, 0f);
   animation.setDuration(200);
   animation.setFillAfter(true);
   red_point.startAnimation(animation); 

   lastDis = offSet; 

  }
  float[] screenSize = MeasureUtil.getScreenSize(MainActivity.this);
  float itemWidth = screenSize[0]/3; 

  pagerCursor.SetOffSet(position,screenOffSet,itemWidth); 

  } 

  @Override
  public void onPageScrollStateChanged(int arg0) {
  switch (arg0) {
  case ViewPager.SCROLL_STATE_DRAGGING://滑动
   isDragging = true;
   break;
  case ViewPager.SCROLL_STATE_IDLE://空闲
   isDragging = false;
   break; 

  default:
   break;
  }
  }
 });
 } 

 class MyAdapter extends PagerAdapter{ 

 @Override
 public int getCount() {
  return imageViewList.size();
 } 

 @Override
 public boolean isViewFromObject(View arg0, Object arg1) {
  return arg0 == arg1;
 } 

 @Override
 public void destroyItem(ViewGroup container, int position, Object object) {
  container.removeView(imageViewList.get(position));
 } 

 @Override
 public Object instantiateItem(ViewGroup container, int position) {
  container.addView(imageViewList.get(position));
  return imageViewList.get(position);
 } 

 }
} 

CustomeDotGroup

package com.example.welcome;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout; 

public class CustomeDotGroup extends LinearLayout { 

 private Context context;
 public CustomeDotGroup(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 this.context = context;
 initRes();
 } 

 public CustomeDotGroup(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
 } 

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

 private void initRes() {
 int dotWidthOrHeight = PhoneUtils.dp2px(context, 10); 

 for (int i = 0; i < 3; i++) {
  ImageView dotImageView = new ImageView(context);
  dotImageView.setBackgroundResource(R.drawable.point_normal); 

  LayoutParams dotImageViewParams = new LayoutParams(dotWidthOrHeight, dotWidthOrHeight);
  if (i != 0) {
  dotImageViewParams.leftMargin = dotWidthOrHeight;
  }
  dotImageView.setLayoutParams(dotImageViewParams);
  this.addView(dotImageView);
 } 

 } 

}

PagerCursor

package com.example.welcome; 

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View; 

public class PagerCursor extends View {
 Context context;
 private Paint mPaint;
 private int screenWidth;
 private int desRight;
 private float itemWidth; 

 public PagerCursor(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 // TODO Auto-generated constructor stub
 } 

 public PagerCursor(Context context, AttributeSet attrs) {
 super(context, attrs);
 this.context = context;
 initRes();
 // TODO Auto-generated constructor stub
 } 

 public PagerCursor(Context context) {
 super(context);
 // TODO Auto-generated constructor stub
 } 

 private void initRes() {
 float[] screenSize = MeasureUtil.getScreenSize((Activity) context);
 screenWidth = (int) screenSize[0];
 Log.d("TAG", ",screenWidth" + screenWidth); 

 mPaint = new Paint();
 mPaint.setColor(getResources().getColor(R.color.contentPressColor));
 mPaint.setStyle(Paint.Style.FILL);
 mPaint.setAntiAlias(true);
 } 

 public void SetOffSet(int position, float screenOffSet, float itemWidth) {
 int offSet = (int) (position * itemWidth + itemWidth * screenOffSet);
 this.itemWidth = itemWidth;
 desRight = offSet;
 Log.d("TAG", "screenOffSet:" + screenOffSet + ",position" + position
  + ",desRigh-->t" + desRight + ",itemWidth" + itemWidth); 

 invalidate();
 } 

 @Override
 protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 Log.d("TAG", "onDraw,desRigh-->t" + desRight + ",itemWidth" + itemWidth);
 canvas.drawRect(desRight, 0f, desRight + itemWidth,
  PhoneUtils.dp2px(context, 5), mPaint);
 }
} 

MeasureUtil

package com.example.welcome; 

import android.app.Activity;
import android.util.DisplayMetrics; 

/**
 * 测绘工具�?
 */
public final class MeasureUtil {
 /**
 * 获取屏幕尺寸
 *
 * @param activity
 *  Activity
 * @return 屏幕尺寸像素值,下标�?的�?为宽,下标为1的�?为高
 */
 public static float[] getScreenSize(Activity activity) {
 DisplayMetrics metrics = new DisplayMetrics();
 activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
 return new float[] { metrics.widthPixels, metrics.heightPixels };
 }
}

PhoneUtils

package com.example.welcome; 

import android.content.Context; 

public class PhoneUtils { 

 public static int dp2px(Context context,float dpValue){
 float scale = context.getResources().getDisplayMetrics().density;
 return (int)(dpValue * scale +0.5f);
 }
} 

源码下载:http://xiazai.jb51.net/201610/yuanma/androidviewpaper(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 使用ViewPager实现图片左右循环滑动自动播放

    ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1. 首先看一些layout下的xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_

  • Android viewpage实现禁止滑动的功能

    Android viewpage实现禁止滑动 由于最近做项目有一个Android viewpage实现禁止滑动这样的功能,开始觉得很是不好实现,但是项目经理分配的任务,客户需求啊,硬着头皮做出来了,这里记录下如何实现. 方法很简单   重写viewpager就可以了,现在将代码贴出. import Android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet;

  • Android使用ViewPager实现无限滑动效果

    前言 其实仔细想一下原理还是挺简单的.无非是当我们滑动到最后一页,再向后滑动时定位到第一页;当我们滑动到第一页,再向前滑动时定位到最后一页. 但是,相信很多朋友都遇到过这个问题:视图的过度效果不自然. 小编也是通过百度和谷歌查找了很多解决方案,实验了很多方法,总结了一个相对不错的方法,接下来给各位分享下滑动效果.实现细节以及一些踩过的坑. 1.无限滑动效果(左右无限滑动) 事先准备好2张滑动图片(有想试验的小伙伴,自备图片啊,小编就不提供了...) 运行效果图(左右无限循环): 为了显示更加直观

  • android配合viewpager实现可滑动的标签栏示例分享

    复制代码 代码如下: package com.example.playtabtest.view; import com.example.playtabtest.R; import android.app.Activity;import android.content.Context;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;impor

  • Android中用RxJava和ViewPager实现轮播图

    前言 很多人要实现轮播图都会想到使用ViewPager + Handler来完成轮播图的效果.但是在RxJava快速发展的情况下,已经可以使用RxJava来代替Handler完成这样任务了. 下面我们就来介绍如何实现RxJava+ViewPager的轮播图. 效果图如下 ViewPager的操作 说到ViwePager应该大家都不陌生,它可以结合普通的View也可以结合Fragment一起使用.在此我也就不对它的使用方法进行过多的介绍了.直接开始介绍轮播的方法. 常见的轮播操作 private

  • Android利用ViewPager实现滑动广告板实例源码

    •android-support-v4.jar,这是谷歌官方给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Android3.0以上可以使用的api.而ViewPager就是其中之一,利用它我们可以做很多事情,从最简单的导航,到页面切换菜单等等. •ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样. •本Demo向大家演示ViewPager的使用,并在用户未滑动View时,每隔5s钟自动切换到下一个View(循环切换),而当用户有Touch到Vi

  • Android ViewPager实现图片轮播效果

    在app中图片的轮播显示可以说是非常常见的实现效果了,其实现原理不过是利用ViewPager,然后利用handler每隔一定的时间将ViewPager的currentItem设置为当前item的position+1即可.先来看看效果图吧: 就是实现这样的一个轮播广告的效果. 因为这个是自己为了练习仿照某旅游类App做的,所以这里的数据是使用抓包工具抓取的,准备数据等工作就不在这里赘述了,反正数据的添加大体都是相同的.我的思路是这样的,从网络上实时的获取数据(当然你也可以将数据写死),然后通过网络

  • Android开发基于ViewPager+GridView实现仿大众点评横向滑动功能

    先给大家展示下效果图,如果大家大家感觉不错,请参考实现思路及代码 1 ViewPager类提供了多界面切换的新效果. 新效果有如下特征: [1] 当前显示一组界面中的其中一个界面. [2] 当用户通过左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分. [3]滑动结束后,界面自动跳转到当前选择的界面中 2 介绍里面几个比较重要的方法与接口 1,OnPageChangeListener ViewPager页面进行切换监听接口 其中我们经常要实现public void onPageSelec

  • Android ViewPager相册横向移动的实现方法

    当我们第一次下载QQ并且打开的时候,会有一个新手引导,引导是几张图片,再加上一些文字说明,向右滑动,直到结束,今天一大早起来研究了一下关于此种效果的实现之ViewPager控件. 下面这个例子将用ViewPager实现横向移动相册,ViewPager有一个对应的PagerAdapter,用于绑定数据:我们需要继承此类并实现自己的功能. 1.首先定义一个显示项所需要使用的数据对象ImageItem 复制代码 代码如下: public class ImageItem { private int id

  • android 通过向viewpage中添加listview来完成滑动效果(类似于qq滑动界面)

    文件名:page.xml 复制代码 代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="fill_parent"    android:layout_height="fill

  • Android开发实战之漂亮的ViewPager引导页

    目前很多软件安装时都会出现引导页面,用户体验很好. 下面就来DIY下: 因为视频上传很麻烦,所以截图了. 首先看看效果图: 点击小点可自由切换,滑动也可以自由切换,最后一个导航页添加了点击跳转. 开始实现引导页: 一.采集需要的图片放入drawable文件里 二.初始化每个导航页的视图 import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.suppo

随机推荐