來做個一頁可以有三個page然後換頁用翻的transform
MainActivity
public class MainActivity extends AppCompatActivity implements ScreenSlidePageFragment.OnFragmentInteractionListener{
private static final int NUM_PAGES = 5;
private float widthScale = 0.6f;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
//mPager.setPageTransformer(false, new ZoomOutPageTransformer());
mPager.setPageTransformer(false, new FlipPageTransformer());
windowWidth = width;
//mPager.setPageMargin(-(int)getResources().getDimension(R.dimen.viewpager_margin));
//set page margin to be half of (viewpager's width - page's width)
//page's width should be widthScale * viewPagerWidth
float viewPagerWidth = getResources().getDimension(R.dimen.viewpager_width);
mPager.setPageMargin((int) ((1.0f - widthScale) * viewPagerWidth / 2.0f));
mOnPageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if(position == NUM_PAGES - 1) {
//avoid to get stuck at last page
mPager.setCurrentItem(NUM_PAGES - 2, true);
return;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
};
mPager.addOnPageChangeListener(mOnPageChangeListener);
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
final ScreenSlidePageFragment returnFragment;
if(position % 2 == 0){
String arg0 = "even";
String arg1 = "isLast";
if(position == NUM_PAGES - 1){
returnFragment = ScreenSlidePageFragment.newInstance(arg0, arg1);
} else {
returnFragment = ScreenSlidePageFragment.newInstance(arg0, "");
}
} else {
String arg0 = "odd";
String arg1 = "isLast";
if(position == NUM_PAGES - 1){
returnFragment = ScreenSlidePageFragment.newInstance(arg0, arg1);
} else {
returnFragment = ScreenSlidePageFragment.newInstance(arg0, "");
}
}
//return new ScreenSlidePageFragment();
return returnFragment;
}
@Override
public int getCount() {
return NUM_PAGES;
}
@Override
public float getPageWidth(int position) {
return widthScale;
}
}
public class FlipPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.85f;
private static final float MIN_ALPHA = 0.5f;
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
int pageHeight = view.getHeight();
float pageFullWidth = (float)pageWidth / widthScale;
//I guess this the page's movement from 1 -> 0 or 0 -> -1 will travel the distance of (pageFullWidth - (float)pageWidth) / 2.0f...
float movement = (pageFullWidth - (float)pageWidth) / 2.0f;
//float approx equal threshold
float threshold = 0.0005f;
if("isLast".equals(view.getTag())){
//do not display last page
view.setAlpha(0);
return;
}
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 1) { // [-1,1]
view.setAlpha(1);
//pageFullWidth * -position: move page's left edge to align viewpager's left edge
//(1.0f + position) * movement: move page back to viewpager's left edge(if -1 < position < 0)
// or view pager's right edge(if 0 < position < 1), but we still need page margin to help...
view.setTranslationX(pageFullWidth * -position + (1.0f + position) * movement);
if(position < -threshold){
view.setPivotX(0);
view.setRotationY(-position * 90.0f);
} else if(position > threshold){
view.setPivotX(pageWidth);
view.setRotationY(-position * 90.0f);
} else {//position == 0.0f
view.setPivotX(0);
//make page to be at center of viewpager
view.setTranslationX(movement);
view.setRotationY(0);
}
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
@Override
public void onFragmentInteraction(Uri uri) {
}
}
ScreenSlidePageFragment
public class ScreenSlidePageFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
public static final String VIEW_TAG_LAST = "last";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
public ScreenSlidePageFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment ScreenSlidePageFragment.
*/
// TODO: Rename and change types and number of parameters
public static ScreenSlidePageFragment newInstance(String param1, String param2) {
ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
//return inflater.inflate(R.layout.fragment_screen_slide_page, container, false);
View view = inflater.inflate(R.layout.fragment_screen_slide_page, container, false);
if("even".equals(mParam1)){
view.setBackgroundColor(getResources().getColor(R.color.primary_purple));
}
if("isLast".equals(mParam2)){
view.setTag("isLast");
}
return view;
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* * See the Android Training lesson Communicating with Other Fragments for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
res/layout/activity_main.xml
res/layout/fragment_screen_slid_page.xml
res/values/strings.xml
AAA Hello blank fragment
res/values/colors.xml
#3F51B5 #303F9F #FF4081 #52bf90 #398564 #FF4081 #e4e5e5 #e0ac69 #c68642 #673AB7 #512DA8 #D1C4E9 #FF9800 #212121 #727272 #FFFFFF #B6B6B6 #374046
res/values/dimens.xml
16dp 16dp 240dp