ViewPageranimation淡入/淡出而不是幻灯片

我从这里得到了FragmentBasics的例子。 有没有办法使ViewPageranimation只是淡入淡出,而不是左右滑动? 我一直在用PageTransformer尝试一些东西,但没有成功,我仍然可以看到它滑动。 所以我想我需要以某种方式强制它的位置保持放置,而滑动我的手指只影响阿尔法。

public class SecondActivity extends Activity { SectionsPagerAdapter mSectionsPagerAdapter; ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); // Create the adapter that will return a fragment for each of the three // primary sections of the activity. mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setPageTransformer(false, new FadePageTransformer()); mViewPager.setAdapter(mSectionsPagerAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.second, 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(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. // Return a PlaceholderFragment (defined as a static inner class below). return PlaceholderFragment.newInstance(position + 1); } @Override public int getCount() { // Show 3 total pages. return 3; } @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.title_section1).toUpperCase(l); case 1: return getString(R.string.title_section2).toUpperCase(l); case 2: return getString(R.string.title_section3).toUpperCase(l); } return null; } } public static class PlaceholderFragment extends Fragment { /** * The fragment argument representing the section number for this fragment. */ private static final String ARG_SECTION_NUMBER = "section_number"; /** * Returns a new instance of this fragment for the given section number. */ public static PlaceholderFragment newInstance(int sectionNumber) { PlaceholderFragment fragment = new PlaceholderFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); fragment.setArguments(args); return fragment; } public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_second, container, false); TextView textView = (TextView) rootView.findViewById(R.id.section_label); textView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER))); return rootView; } } public class FadePageTransformer implements ViewPager.PageTransformer { public void transformPage(View view, float position) { if (position < -1 || position > 1) { view.setAlpha(0); } else if (position <= 0 || position <= 1) { // Calculate alpha. Position is decimal in [-1,0] or [0,1] float alpha = (position <= 0) ? position + 1 : 1 - position; view.setAlpha(alpha); } else if (position == 0) { view.setAlpha(1); } } } 

Solutions Collecting From Web of "ViewPageranimation淡入/淡出而不是幻灯片"

这应该更适合淡入/淡出变换:

  public void transformPage(View view, float position) { view.setTranslationX(view.getWidth() * -position); if(position <= -1.0F || position >= 1.0F) { view.setAlpha(0.0F); } else if( position == 0.0F ) { view.setAlpha(1.0F); } else { // position is between -1.0F & 0.0F OR 0.0F & 1.0F view.setAlpha(1.0F - Math.abs(position)); } } 

基于@ murena的回答,这应该更适合淡入/淡出变换。 在animation结束时,位置恢复为默认值。

 public void transformPage(View view, float position) { if(position <= -1.0F || position >= 1.0F) { view.setTranslationX(view.getWidth() * position); view.setAlpha(0.0F); } else if( position == 0.0F ) { view.setTranslationX(view.getWidth() * position); view.setAlpha(1.0F); } else { // position is between -1.0F & 0.0F OR 0.0F & 1.0F view.setTranslationX(view.getWidth() * -position); view.setAlpha(1.0F - Math.abs(position)); } } 

一个简单的衰落变压器可以这样实现:

 private static class FadePageTransformer implements ViewPager.PageTransformer { public void transformPage(View view, float position) { view.setAlpha(1 - Math.abs(position)); if (position < 0) { view.setScrollX((int)((float)(view.getWidth()) * position)); } else if (position > 0) { view.setScrollX(-(int) ((float) (view.getWidth()) * -position)); } else { view.setScrollX(0); } } } 

也许不是你想要的东西,而是一个很好的起点。

我发现@ murena的回答非常有帮助。 不过,当我尝试将OnClickListener添加到每个选项卡时,我遇到了一个问题。 我需要每个页面打开一个不同的URL链接。 我修改了代码来隐藏看不见的视图,并添加了一些额外的效果,以0.5的速度滑动视图。

 public void transformPage(View view, float position) { if (position <= -1.0F || position >= 1.0F) { // [-Infinity,-1) OR (1,+Infinity] view.setAlpha(0.0F); view.setVisibility(View.GONE); } else if( position == 0.0F ) { // [0] view.setAlpha(1.0F); view.setVisibility(View.VISIBLE); } else { // Position is between [-1,1] view.setAlpha(1.0F - Math.abs(position)); view.setTranslationX(-position * (view.getWidth() / 2)); view.setVisibility(View.VISIBLE); } }