ViewPager动画效果

来源:互联网 发布:数据库系统课后题答案 编辑:程序博客网 时间:2024/06/06 05:09

//自定义MyViewPager继承ViewPager

public class MyViewPager 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<Integer, View> mChildrenViews = new LinkedHashMap<Integer, View>();
/**
* 滑动时左边的元素
*/
private View mLeft;
/**
* 滑动时右边的元素
*/
private View mRight;


public MyViewPager(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();
}
}


}


//MainActivity


public class MainActivity extends Activity {


private int[] mImgIds;
private MyViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImgIds = new int[] { R.drawable.a, R.drawable.b, R.drawable.c,
R.drawable.d, R.drawable.e, R.drawable.f};
mViewPager = (MyViewPager) findViewById(R.id.id_viewPager);
mViewPager.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return mImgIds.length;
}


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


@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;
}



});


}
}




//布局文件

<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=".MainActivity" >


    <com.example.jsqviewpager01.MyViewPager
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/id_viewPager" />


</RelativeLayout>

1 0