package com.halzhang.android.example.pagetransformerdemo;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
private static final String LOG_TAG = "PageTransformer";
private static final int SIZE = 3;
private ViewPager mViewPager;
private View[] mViews = new View[SIZE];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (ViewPager) findViewById(R.id.viewpager);
mViewPager.setPageTransformer(false, pageTransformer);
for (int i = 0; i < mViews.length; i++) {
mViews[i] = getLayoutInflater().inflate(R.layout.item, null);
TextView view = (TextView) mViews[i].findViewById(R.id.text);
view.setText(String.valueOf(i));
mViews[i].setTag(i);
}
mViewPager.setAdapter(new MyViewPagerAdapter());
}
private ViewPager.PageTransformer pageTransformer = new ViewPager.PageTransformer() {
private static final float MIN_SCALE = 0.75f;
/**
* Apply a property transformation to the given page.
*
* @param page Apply the transformation to this page
* @param position Position of page relative to the current front-and-center
* position of the pager. 0 is front and center. 1 is one full
* page position to the right, and -1 is one page position to the left.
*/
@Override
public void transformPage(View page, float position) {
//分析
int viewIndex = (int) page.getTag();
Log.d(LOG_TAG, "ViewIndex: " + viewIndex + " position: " + position);
// The >= 1 is needed so that the page
// (page A) that transitions behind the newly visible
// page (page B) that comes in from the left does not
// get the touch events because it is still on screen
// (page A is still technically on screen despite being
// invisible). This makes sure that when the transition
// has completely finished, we revert it to its default
// behavior and move it off of the screen.
// if (position < 0 || position >= 1.f) {
// /*
// 向左滚动,这是要出去的那个页面;
// 向右滚动,这是要进来的那个页面
// */
// page.setTranslationX(0);
// page.setAlpha(1.f);
// page.setScaleX(1);
// page.setScaleY(1);
// page.setBackgroundColor(getResources().getColor(android.R.color.holo_green_light));
//
// int width = page.getWidth();
//
// TextView view = (TextView) page.findViewById(R.id.text);
// float x = (float) (view.getX() + width * 0.5 * position * 0.1);
// Log.d(LOG_TAG, "ViewIndex: " + viewIndex + " TextView x: " + x);
// view.setX(x);
//
// } else {
// /*
// 向左滚动,这是要进来的那个页面;
// 向右滚动,这是要出去的那个页面
// */
// page.setTranslationX(-position * page.getWidth());
// page.setAlpha(Math.max(0, 1.f - position));
// final float scale = Math.max(0, 1.f - position * 0.3f);
// page.setScaleX(scale);
// page.setScaleY(scale);
// page.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_bright));
// }
int pageWidth = page.getWidth();
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
page.setAlpha(0);
} else if (position <= 0) { // [-1,0]
//TODO 应该理解成:View的位置处于[-1,0] 这个区间时,做什么处理
// Use the default slide transition when moving to the left page
page.setAlpha(1);
page.setTranslationX(0);
page.setScaleX(1);
page.setScaleY(1);
} else if (position <= 1) { // (0,1]
//TODO 应该理解成:View 的位置处于(0,1] 这个区间时,做什么处理
// Fade the page out.
page.setAlpha(1 - position);
// Counteract the default slide transition
page.setTranslationX(pageWidth * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE
+ (1 - MIN_SCALE) * (1 - Math.abs(position));
page.setScaleX(scaleFactor);
page.setScaleY(scaleFactor);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
page.setAlpha(0);
}
}
};
private class MyViewPagerAdapter extends PagerAdapter {
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = mViews[position];
container.addView(view);
return mViews[position];
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViews[position]);
}
@Override
public int getCount() {
return mViews.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}