1、修改切换item的时间

public class FixedSpeedScroller extends Scroller {
private int mDuration = ; public FixedSpeedScroller(Context context) {
super(context);
} public FixedSpeedScroller(Context context, android.view.animation.Interpolator interpolator) {
super(context, interpolator);
} public FixedSpeedScroller(Context context, android.view.animation.Interpolator interpolator, boolean flywheel) {
super(context, interpolator, flywheel);
} @Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, mDuration);
} @Override
public void startScroll(int startX, int startY, int dx, int dy) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
}
private void setViewPagerScrollSpeed(){
try {
Field mScroller = null;
mScroller = ViewPager.class.getDeclaredField("mScroller");
if(mScroller != null){
mScroller.setAccessible(true);
FixedSpeedScroller scroller = new FixedSpeedScroller( getContext(), new LinearInterpolator());
mScroller.set(mUserInfoViewPager, scroller);
}
}catch(NoSuchFieldException e){ }catch (IllegalArgumentException e){ }catch (IllegalAccessException e){ }
}

2、修改Item的切换动画

mUserInfoViewPager.setPageTransformer(true, new PageTransformer() {

            private static final float MIN_SCALE = 0.85f;
private static final float MIN_ALPHA = 0.5f; @Override
public void transformPage(View view, float position) {
//
int pageWidth = view.getWidth();
int pageHeight = view.getHeight(); if (position < -) {
view.setAlpha(); } else if (position <= ) {
//a页滑动至b页 ; a页从 0.0 -1 ;b页从1 ~ 0.0
// [-1,1]
// Modify the default slide transition to shrink the page as well
float scaleFactor = Math.max(MIN_SCALE, - Math.abs(position));
float vertMargin = pageHeight * ( - scaleFactor) / ;
float horzMargin = pageWidth * ( - scaleFactor) / ;
if (position < ){
view.setTranslationX(horzMargin - vertMargin / );
} else {
view.setTranslationX(-horzMargin + vertMargin / );
} // Scale the page down (between MIN_SCALE and 1)
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor); // Fade the page relative to its size.
view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE)/ ( - MIN_SCALE) * ( - MIN_ALPHA)); } else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha();
} }
});

3、ViewPager实现Gallery类似效果

package com.joyodream.pingo.near.ui;

import java.lang.reflect.Field;

import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.view.animation.Transformation;
import android.widget.Scroller; import com.joyodream.common.util.DipPixelUtil; /**
*
* 自定义的展示图片的控件
* 通过Camera 调整z轴距离,实现图片放大缩小
*
* 注意:
* 1、为了实现在屏幕上面看到多个Item,需要在滑动的过程中刷新父控件
* 2、另外,通过设置clipChildren = false,不去裁剪子控件的绘图区域
* 3、
*
* @author lipeilong
*
*/
public class NearViewPager extends ViewPager { /**
* The camera class is used to 3D transformation matrix.
*/
private Camera mCamera = new Camera(); /**
* The max zoom value (Z axis).
*/
private int mMaxZoom = -; private int mMaxAlpha = 0x8f; private OnPageChangeListener mScrollListener; private int mScrollPosition; private int mScrollOffset; public int mCurPosition; private float mDownX; private float mDownY; private boolean mClick; public NearViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
//
init();
} public NearViewPager(Context context) {
super(context);
//
init();
} private void init() { // Enable set transformation.
this.setStaticTransformationsEnabled(true);
// Enable set the children drawing order.
this.setChildrenDrawingOrderEnabled(true); this.setOverScrollMode(ViewPager.OVER_SCROLL_NEVER);
super.setOnPageChangeListener(new MyOnPageChangeListener()); setViewPagerScrollSpeed();
} private void setViewPagerScrollSpeed(){
try {
Field mScroller = null;
mScroller = ViewPager.class.getDeclaredField("mScroller");
if(mScroller != null){
mScroller.setAccessible(true);
FixedSpeedScroller scroller = new FixedSpeedScroller( getContext(), new LinearInterpolator());
mScroller.set(this, scroller);
}
}catch(NoSuchFieldException e){ }catch (IllegalArgumentException e){ }catch (IllegalAccessException e){ }
} @Override
protected int getChildDrawingOrder(int childCount, int i) {
// Current selected index.
int selectedIndex = getCurrentItem(); if (selectedIndex < ) {
return i;
} if (i < selectedIndex) {
return i;
} else if (i >= selectedIndex) {
return childCount - - i + selectedIndex;
} else {
return i;
}
} @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
} @Override
protected boolean getChildStaticTransformation(View child, Transformation t) {
super.getChildStaticTransformation(child, t);
t.clear();
t.setTransformationType(Transformation.TYPE_MATRIX); int index = findViewIndex(child);
if(index != -){
transformImageBitmap(child, t, index);
} return true;
} /**
*
* 找出子控件的索引
* @param child
* @return
*/
private int findViewIndex(View child){ int index = (Integer) child.getTag(); return index;
} /**
*
* 刷新所有的子控件,通过这个来触发 getChildStaticTransformation 的调用
*
*/
private void invalidateVisibleChilds() {
for (int i = ; i < getChildCount(); i++) {
getChildAt(i).invalidate();
}
} /**
*
* @param child
* @param t
* @param index
*/
private void transformImageBitmap(View child, Transformation t, int index) { mCamera.save(); final Matrix imageMatrix = t.getMatrix();
final int imageHeight = child.getHeight();
final int imageWidth = child.getWidth();
int width = getPageMargin() + imageWidth; if(index == mScrollPosition){ // 当前项从最大变化到最小 z轴变化范围 mMaxZoom *(1 -- 0) float dz = mMaxZoom * ( - mScrollOffset * 1f / width);
int alpha = (int) (mMaxAlpha * mScrollOffset * 1f / width);
mCamera.translate(, , dz); if(child instanceof NearImageView){
((NearImageView)child).setShadeAlpha(alpha);
} }else if(index == mScrollPosition + ){ // 当前项的后一项从最小变化到最大 ,z轴变化范围 mMaxZoom * (0 -- 1) float dz = mMaxZoom * mScrollOffset * 1f / width; int alpha = (int) (mMaxAlpha * ( - mScrollOffset * 1f / width ));
mCamera.translate(, , dz); if(child instanceof NearImageView){
((NearImageView)child).setShadeAlpha(alpha);
} }else { // 当前项的后2项或者前N项大小不发生变化,z轴不变
mCamera.translate(, , ); if(child instanceof NearImageView){
((NearImageView)child).setShadeAlpha(mMaxAlpha);
}
} mCamera.getMatrix(imageMatrix); imageMatrix.postTranslate((imageWidth / ), (imageHeight / ));
imageMatrix.preTranslate(-(imageWidth / ), -(imageHeight / )); mCamera.restore();
} @Override
public void setOnPageChangeListener(OnPageChangeListener listener) {
mScrollListener = listener;
}; /**
* @author lipeilong
*
*/
private class MyOnPageChangeListener implements OnPageChangeListener { @Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (mScrollListener != null) {
mScrollListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
} mScrollPosition = position;
mScrollOffset = positionOffsetPixels; // 刷新子控件
if(System.currentTimeMillis() % == ){ invalidateVisibleChilds();
}
} @Override
public void onPageSelected(int position) {
mCurPosition = position;
if (mScrollListener != null) {
mScrollListener.onPageSelected(position);
}
} @Override
public void onPageScrollStateChanged(final int state) { if (mScrollListener != null) {
mScrollListener.onPageScrollStateChanged(state);
}
}
} @Override
public boolean onTouchEvent(MotionEvent ev) {
//
final float MAX_DISTANCE = ;
switch(ev.getAction()){
case MotionEvent.ACTION_DOWN:
mDownX = ev.getRawX();
mDownY = ev.getRawY();
mClick = true;
break;
case MotionEvent.ACTION_UP:
if(mClick && Math.abs(ev.getRawX()- mDownX) < MAX_DISTANCE && Math.abs(ev.getRawY() - mDownY) < MAX_DISTANCE){
// 点击事件
performMyClick(ev); }
break;
case MotionEvent.ACTION_MOVE:
if(Math.abs(ev.getRawX()- mDownX) > MAX_DISTANCE || Math.abs(ev.getRawY() - mDownY) > MAX_DISTANCE){
mClick = false;
}
break;
} return super.onTouchEvent(ev);
} private void performMyClick(MotionEvent ev){ int index = getCurrentItem();
if(isAtLeft(ev)){
setCurrentItem(index - );
}else if(isAtRight(ev)){
setCurrentItem(index + );
} } private boolean isAtLeft(MotionEvent ev){
int margin = DipPixelUtil.dip2px(getContext(), );
int left = getLeft() - margin;
int right = getRight() + margin;
int top = getTop();
int bottom = getBottom(); // 必须使用全局坐标,同时要减去title和通知栏高度
int x = (int) ev.getRawX();
int y = (int) ev.getRawY() - DipPixelUtil.dip2px(getContext(), );
if(y > top && y < bottom){ if(x < left){
return true;
}
} return false;
} private boolean isAtRight(MotionEvent ev){
int margin = DipPixelUtil.dip2px(getContext(), );
int left = getLeft() - margin;
int right = getRight() + margin;
int top = getTop();
int bottom = getBottom(); int x = (int) ev.getRawX();
int y = (int) ev.getRawY() - DipPixelUtil.dip2px(getContext(), );
if(y > top && y < bottom){ if(x > right){
return true;
}
} return false;
} public class FixedSpeedScroller extends Scroller {
private int mDuration = ; public FixedSpeedScroller(Context context) {
super(context);
} public FixedSpeedScroller(Context context, android.view.animation.Interpolator interpolator) {
super(context, interpolator);
} public FixedSpeedScroller(Context context, android.view.animation.Interpolator interpolator, boolean flywheel) {
super(context, interpolator, flywheel);
} @Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, mDuration);
} @Override
public void startScroll(int startX, int startY, int dx, int dy) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
}
}

注意:1、设置父控件、子控件的clipChildren=false 2、滑动的时候刷新子控件

Viewpager 的相关总结的更多相关文章

  1. Android viewpager + 可缩放的imageview

    http://files.cnblogs.com/files/liaolandemengxiang/PhotoWallFallsDemo.rar http://files.cnblogs.com/fi ...

  2. Android开发实战之ViewPager的轮播

    在安卓开发的许多控件中,如果你没有使用过ViewPager,就不能算是一个安卓开发工程师,在本篇博文中,我会总结ViewPager的使用方法, 以及一些开发中的拓展.希望本篇博文对你的学习和工作有所帮 ...

  3. 封装一个ViewPager真正的实现图片无限循环滚动带导航点

    效果图: 大家在写项目的过程中常常会碰到须要实现Viewpager里面载入几张图片来循环自己主动轮播的效果,假设不封装一下的话代码分散在activity里面会显得非常乱.并且也不利于我们下次复用,所以 ...

  4. Android之实现ViewPagerIndicator

    PS:最近一直忙于学习任务,一直没有时间去写博客.今天周六,终于有时间了. 学习任务: 1.打造一个自己的ViewPagerIndicator   最近被安排了一大堆的学习任务,感觉老板还是很好的,让 ...

  5. TabLayout:另一种Tab的实现方式

    http://blog.csdn.NET/aigestudio/article/details/47155769 在5.0以前我们想要实现像网易新闻客户端那样的的Tab可以有很多种选择: 比如古老的T ...

  6. Android:手把手教你打造可缩放移动的ImageView(下)

    在上一篇Android:手把手教你打造可缩放移动的ImageView最后提出了一个注意点:当自定义的MatrixImageView如ViewPager.ListView等带有滑动效果的ViewGrou ...

  7. 嵌入式单片机STM32应用技术(课本)

    目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...

  8. Viewpager以及ViewPagerIndicator的相关使用

    ViewPagerIndicator开源框架可以用来在ViewPager上方做标题,可以在ViewPager下方做跟随移动的小圆点,这个类库必须和自己的项目在电脑的同一磁盘盘符下,比如都在D盘或者E盘 ...

  9. Android之自定义ViewPager实现图片的无线轮播

    PS:以前也写过关于图片轮播这一块的博客.不过写的很烂,并且很多情况没有考虑到(没有支持无线轮播,和手势点击事件).因此这里写一篇补上.也是当时太年轻了. 注:图片请放大后再看.否则看不清楚. 学习内 ...

随机推荐

  1. 怎样解决WampServer #1405 - Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)

    转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47903227 之前一直在用wampserver,然后环境配置也是正确的,可是过了一 ...

  2. Android开发之将拍摄的图片传至服务器

    package com.example.oldtab; import java.io.ByteArrayOutputStream; import java.io.File; import java.i ...

  3. django之创建第8个项目-数据库配置及同步研究

    1.sqlitestudio-2.1.5数据库可视化工具--百度云盘下载 2.编写C:\djangoweb\helloworld\blog\models.py文件 # Create your mode ...

  4. 触发JVM进行Full GC的情况及应对策略

    堆内存划分为 Eden.Survivor 和 Tenured/Old 空间,如下图所示: 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为M ...

  5. ArcGIS调整影像颜色输出

    有碰到一些质量很差的遥感影像,颜色需要进行调整(主要是针对看)输出,这里记录一下ArcGIS中的调整输出方式. 1.首先把影像文件拖入ArcMap中,然后右键单击图层列表中的图像,选择属性. 2.选择 ...

  6. weblogic10.3.6打补丁PSU

    weblogic的补丁,非付费不能下载... Oracle WebLogic Server Patch Set Update 10.3.6.0.170418 PATCH_ID - RVBS    #补 ...

  7. weblogic静默安装指导

    Linux图形化很少,再生产上.静默安装基本上是家常便饭... 心得: Oracle的官方文档很全,值得后续学习指导文件 weblogic10.3.6官方文档 https://docs.oracle. ...

  8. 从零開始学android&lt;AnalogClock与DigitalClock时钟组件.三十一.&gt;

    这两个组件比較交单,大家看下会使用即可了 XML文件配置 <span style="font-size:18px;"><RelativeLayout xmlns: ...

  9. Windows XPSP3通过网络级身份验证方式连接Windows Server 2008远程桌面

    远程桌面大大方便了大家的日常管理工作,Windows Server 2008同样秉承这一优秀特性,并引入网络级身份验证(NLA)作为远程桌面连接的默认身份验证方式. 网络级身份验证 (NLA) 是一种 ...

  10. [解决问题]selenium.remote.UnreachableBrowserException 异常分析并解决问题

    I have a set of automations that work fantastically in Firefox and Chrome, and I'd like to launch an ...