设为首页 加入收藏

TOP

Android 自定义 ViewPager 打造千变万化的图片切换效果(二)
2015-08-31 21:24:49 来源: 作者: 【 】 浏览:95
Tags:Android 定义 ViewPager 打造 千变万化 图片 切换 效果
@Override
? ?public void destroyItem(ViewGroup container, int position,
? ? ?Object object)
? ?{
? ? container.removeView((View) object);
? ?}


? ?@Override
? ?public Object instantiateItem(ViewGroup container, int position)
? ?{
? ? ImageView imageView = new ImageView(MainActivity.this);
? ? imageView.setImageResource(mImgIds[position]);
? ? imageView.setScaleType(ScaleType.CENTER_CROP);
? ? container.addView(imageView);
? ? mViewPager.setObjectForPosition(imageView, position);
? ? return imageView;
? ?}


? ?@Override
? ?public int getCount()
? ?{
? ? return mImgIds.length;
? ?}
? });


?}


}


这个很常见的代码,就是初始化ViewPager~~就没啥可说的了~~有一点需要注意:在instantiateItem方法,我们多调用了一个mViewPager.setObjectForPosition(imageView, position);其实就是为了给我们的Map存值


主要看自定义的ViewPager


package com.example.zhy_jazzyviewpager;


import java.util.HashMap;
import java.util.LinkedHashMap;


import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;


import com.nineoldandroids.view.ViewHelper;


public class MyJazzyViewPager extends ViewPager
{
?private float mTrans;
?private float mScale;
?/**
? * 最大的缩小比例
? */
?private static final float SCALE_MAX = 0.5f;
?private static final String TAG = "MyJazzyViewPager";
?/**
? * 保存position与对于的View
? */
?private HashMap mChildrenViews = new LinkedHashMap();
?/**
? * 滑动时左边的元素
? */
?private View mLeft;
?/**
? * 滑动时右边的元素
? */
?private View mRight;


?public MyJazzyViewPager(Context context, AttributeSet attrs)
?{
? super(context, attrs);
?}


?@Override
?public void onPageScrolled(int position, float positionOffset,
? ?int positionOffsetPixels)
?{


//? Log.e(TAG, "position=" + position+", positionOffset = "+positionOffset+" ,positionOffsetPixels =? " + positionOffsetPixels+" , currentPos = " + getCurrentItem());
?
? //滑动特别小的距离时,我们认为没有动,可有可无的判断
? float effectOffset = isSmall(positionOffset) ? 0 : positionOffset;
?
? //获取左边的View
? mLeft = findViewFromObject(position);
? //获取右边的View
? mRight = findViewFromObject(position + 1);
?
? // 添加切换动画效果
? animateStack(mLeft, mRight, effectOffset, positionOffsetPixels);
? super.onPageScrolled(position, positionOffset, positionOffsetPixels);
?}


?public void setObjectForPosition(View view, int position)
?{
? mChildrenViews.put(position, view);
?}


?/**
? * 通过过位置获得对应的View
? *
? * @param position
? * @return
? */
?public View findViewFromObject(int position)
?{
? return mChildrenViews.get(position);
?}


?private boolean isSmall(float positionOffset)
?{
? return Math.abs(positionOffset) < 0.0001;
?}


?protected void animateStack(View left, View right, float effectOffset,
? ?int positionOffsetPixels)
?{
? if (right != null)
? {
? ?/**
? ? * 缩小比例 如果手指从右到左的滑动(切换到后一个):0.0~1.0,即从一半到最大
? ? * 如果手指从左到右的滑动(切换到前一个):1.0~0,即从最大到一半
? ? */
? ?mScale = (1 - SCALE_MAX) * effectOffset + SCALE_MAX;
? ?/**
? ? * x偏移量: 如果手指从右到左的滑动(切换到后一个):0-720 如果手指从左到右的滑动(切换到前一个):720-0
? ? */
? ?mTrans = -getWidth() - getPageMargin() + positionOffsetPixels;
? ?ViewHelper.setScaleX(right, mScale);
? ?ViewHelper.setScaleY(right, mScale);
? ?ViewHelper.setTranslationX(right, mTrans);
? }
? if (left != null)
? {
? ?left.bringToFront();
? }
?}
}


可以看到,核心代码都是onPageScrolled,我们通过findViewFromObject(position); findViewFromObject(position + 1);分别获取了左右两边的View,然后添加动画效果;当前这个例子添加了两个动画,一个是从0.5放大到1.0或者1.0缩小到0.5,没错由我们的positionOffset提供梯度的变化~~还有个平移的动画:下一页直接移动到当前屏幕(默认是在右边,可以注释这个

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇谈谈为 Linux 内核写驱动的编码规.. 下一篇JVM垃圾收集器与内存分配策略

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: