From 07949d4d9a318203e573895be093dcf97bd3139a Mon Sep 17 00:00:00 2001 From: kHRYSTAL <723526676@qq.com> Date: Sat, 7 May 2016 16:49:07 +0800 Subject: [PATCH 1/3] add MagicViewPager support Fragment vertical scroll --- app/src/main/AndroidManifest.xml | 7 +- .../magicviewpager/sample/MainActivity.java | 4 + .../magicviewpager/sample/ScrollFragment.java | 103 +++++++++ .../sample/SupportScrollActivity.java | 119 ++++++++++ app/src/main/res/layout/list_item.xml | 11 + app/src/main/res/layout/scroll_activity.xml | 14 ++ app/src/main/res/layout/scroll_fragment.xml | 17 ++ app/src/main/res/values/strings.xml | 1 + library/src/main/AndroidManifest.xml | 2 +- .../transformer/AlphaPageTransformer.java | 13 +- .../RotateDownPageTransformer.java | 38 +++- .../transformer/RotateUpPageTransformer.java | 38 +++- .../transformer/RotateYTransformer.java | 32 ++- .../transformer/ScaleInTransformer.java | 46 ++-- .../com/zhy/magicviewpager/widget/Hacky.java | 59 +++++ .../magicviewpager/widget/MagicViewPager.java | 213 ++++++++++++++++++ .../magicviewpager/widget/TransformType.java | 44 ++++ .../src/main/res/layout/magic_view_pager.xml | 13 ++ library/src/main/res/values/attrs.xml | 17 ++ 19 files changed, 734 insertions(+), 57 deletions(-) create mode 100644 app/src/main/java/com/zhy/magicviewpager/sample/ScrollFragment.java create mode 100644 app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollActivity.java create mode 100644 app/src/main/res/layout/list_item.xml create mode 100644 app/src/main/res/layout/scroll_activity.xml create mode 100644 app/src/main/res/layout/scroll_fragment.xml create mode 100644 library/src/main/java/com/zhy/magicviewpager/widget/Hacky.java create mode 100644 library/src/main/java/com/zhy/magicviewpager/widget/MagicViewPager.java create mode 100644 library/src/main/java/com/zhy/magicviewpager/widget/TransformType.java create mode 100644 library/src/main/res/layout/magic_view_pager.xml create mode 100644 library/src/main/res/values/attrs.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 54cbce4..66a28bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,21 +1,22 @@ + package="com.zhy.magicviewpager.sample"> + android:theme="@style/AppTheme"> + android:label="@string/app_name"> + diff --git a/app/src/main/java/com/zhy/magicviewpager/sample/MainActivity.java b/app/src/main/java/com/zhy/magicviewpager/sample/MainActivity.java index 93046cf..18c37b4 100644 --- a/app/src/main/java/com/zhy/magicviewpager/sample/MainActivity.java +++ b/app/src/main/java/com/zhy/magicviewpager/sample/MainActivity.java @@ -1,5 +1,6 @@ package com.zhy.magicviewpager.sample; +import android.content.Intent; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; @@ -118,6 +119,9 @@ public boolean onOptionsItemSelected(MenuItem item) }else if ("RotateDown and Alpha And ScaleIn".equals(title)) { mViewPager.setPageTransformer(true, new RotateDownPageTransformer(new AlphaPageTransformer(new ScaleInTransformer()))); + }else if ("Add Transform Can Vertical Scroll".equals(title)) + { + startActivity(new Intent(MainActivity.this,SupportScrollActivity.class)); } setTitle(title); diff --git a/app/src/main/java/com/zhy/magicviewpager/sample/ScrollFragment.java b/app/src/main/java/com/zhy/magicviewpager/sample/ScrollFragment.java new file mode 100644 index 0000000..7edc88a --- /dev/null +++ b/app/src/main/java/com/zhy/magicviewpager/sample/ScrollFragment.java @@ -0,0 +1,103 @@ +package com.zhy.magicviewpager.sample; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ListView; +import android.widget.TextView; + +import java.util.ArrayList; + +/** + * usage: + * author: kHRYSTAL + * create time: 16/5/7 + * update time: + * email: 723526676@qq.com + */ +public class ScrollFragment extends Fragment{ + + public static Fragment getInstance() { + ScrollFragment fragment = new ScrollFragment(); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.scroll_fragment, container, false); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initView(view); + } + + private void initView(View view) { + ListView listView = (ListView)view.findViewById(R.id.list_view); + ArrayList list = new ArrayList<>(); + for (int i = 0; i < 100; i++) { + list.add(""+i); + } + SimpleAdapter adapter = new SimpleAdapter(getContext(),list); + listView.setAdapter(adapter); + adapter.notifyDataSetChanged(); + + } + + public class SimpleAdapter extends BaseAdapter { + + private ArrayList list; + private Context context; + + public SimpleAdapter(Context context,ArrayList list){ + this.list = list; + this.context = context; + } + + @Override + public int getCount() { + return list.size(); + } + + @Override + public Object getItem(int position) { + return list.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder holder = null; + if (convertView == null) { + convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, null); + holder = new ViewHolder(); + holder.textView = (TextView)convertView.findViewById(R.id.text); + convertView.setTag(holder); + } else { + holder = (ViewHolder)convertView.getTag(); + } + holder.textView.setText(list.get(position)); + return convertView; + } + } + + public class ViewHolder{ + public TextView textView; + } +} diff --git a/app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollActivity.java b/app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollActivity.java new file mode 100644 index 0000000..cf1a9c1 --- /dev/null +++ b/app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollActivity.java @@ -0,0 +1,119 @@ +package com.zhy.magicviewpager.sample; + +import android.content.Intent; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.ViewGroup; +import android.widget.Toast; + +import com.zhy.magicviewpager.transformer.AlphaPageTransformer; +import com.zhy.magicviewpager.transformer.NonPageTransformer; +import com.zhy.magicviewpager.transformer.RotateDownPageTransformer; +import com.zhy.magicviewpager.transformer.RotateUpPageTransformer; +import com.zhy.magicviewpager.transformer.RotateYTransformer; +import com.zhy.magicviewpager.transformer.ScaleInTransformer; +import com.zhy.magicviewpager.widget.MagicViewPager; + +import java.util.ArrayList; + +public class SupportScrollActivity extends AppCompatActivity { + + private ArrayList list; + private MagicViewPager mViewPager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.scroll_activity); + mViewPager = (MagicViewPager) findViewById(R.id.viewpager); + list = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + list.add(""+i); + } + + SimplePagerAdapter adapter = new SimplePagerAdapter(getSupportFragmentManager()); + mViewPager.getViewPager().setAdapter(adapter); + adapter.notifyDataSetChanged(); + } + + public class SimplePagerAdapter extends FragmentPagerAdapter { + + + public SimplePagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public int getCount() { + return 5; + } + + @Override + public Object instantiateItem(ViewGroup container, int position) { + return super.instantiateItem(container, position); + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + } + + @Override + public Fragment getItem(int position) { + return ScrollFragment.getInstance(); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + String[] effects = this.getResources().getStringArray(R.array.magic_effect); + for (String effect : effects) + menu.add(effect); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + String title = item.getTitle().toString(); + if ("RotateDown".equals(title)) + { + mViewPager.setPageTransformer(new RotateDownPageTransformer()); + } else if ("RotateUp".equals(title)) + { + mViewPager.setPageTransformer(new RotateUpPageTransformer()); + } else if ("RotateY".equals(title)) + { + mViewPager.setPageTransformer(new RotateYTransformer()); + } else if ("Standard".equals(title)) + { + mViewPager.setClipChildren(false); + mViewPager.setPageTransformer(null); + } else if ("Alpha".equals(title)) + { + mViewPager.setClipChildren(false); + mViewPager.setPageTransformer(new AlphaPageTransformer()); + } else if ("ScaleIn".equals(title)) + { + mViewPager.setPageTransformer(new ScaleInTransformer()); + } else if ("RotateDown and Alpha".equals(title)) + { + mViewPager.setPageTransformer(new RotateDownPageTransformer(new AlphaPageTransformer())); + }else if ("RotateDown and Alpha And ScaleIn".equals(title)) + { + mViewPager.setPageTransformer(new RotateDownPageTransformer(new AlphaPageTransformer(new ScaleInTransformer()))); + }else if ("Add Transform Can Vertical Scroll".equals(title)) + { + onBackPressed(); + } + + setTitle(title); + + return true; + } +} diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml new file mode 100644 index 0000000..774998f --- /dev/null +++ b/app/src/main/res/layout/list_item.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/scroll_activity.xml b/app/src/main/res/layout/scroll_activity.xml new file mode 100644 index 0000000..f6c196a --- /dev/null +++ b/app/src/main/res/layout/scroll_activity.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/scroll_fragment.xml b/app/src/main/res/layout/scroll_fragment.xml new file mode 100644 index 0000000..45426ca --- /dev/null +++ b/app/src/main/res/layout/scroll_fragment.xml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 933f2f8..a9ba245 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,6 +13,7 @@ ScaleIn RotateDown and Alpha RotateDown and Alpha And ScaleIn + Add Transform Can Vertical Scroll diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index 2255014..acf5e61 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.zhy.magicviewpager"> diff --git a/library/src/main/java/com/zhy/magicviewpager/transformer/AlphaPageTransformer.java b/library/src/main/java/com/zhy/magicviewpager/transformer/AlphaPageTransformer.java index 985eeb9..11e6f14 100644 --- a/library/src/main/java/com/zhy/magicviewpager/transformer/AlphaPageTransformer.java +++ b/library/src/main/java/com/zhy/magicviewpager/transformer/AlphaPageTransformer.java @@ -2,6 +2,7 @@ import android.annotation.TargetApi; import android.os.Build; +import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.view.View; @@ -35,21 +36,25 @@ public void pageTransform(View view, float position) { if (position < -1) { // [-Infinity,-1) - view.setAlpha(mMinAlpha); +// view.setAlpha(mMinAlpha); + ViewCompat.setAlpha(view,mMinAlpha); } else if (position <= 1) { // [-1,1] if (position < 0) //[0,-1] { //[1,min] - view.setAlpha(mMinAlpha + (1 - mMinAlpha) * (1 + position)); +// view.setAlpha(mMinAlpha + (1 - mMinAlpha) * (1 + position)); + ViewCompat.setAlpha(view,mMinAlpha + (1 - mMinAlpha) * (1 + position)); } else//[1,0] { //[min,1] - view.setAlpha(mMinAlpha + (1 - mMinAlpha) * (1 - position)); +// view.setAlpha(mMinAlpha + (1 - mMinAlpha) * (1 - position)); + ViewCompat.setAlpha(view,mMinAlpha + (1 - mMinAlpha) * (1 - position)); } } else { // (1,+Infinity] - view.setAlpha(mMinAlpha); +// view.setAlpha(mMinAlpha); + ViewCompat.setAlpha(view,mMinAlpha + (1 - mMinAlpha) * (1 - position)); } } } diff --git a/library/src/main/java/com/zhy/magicviewpager/transformer/RotateDownPageTransformer.java b/library/src/main/java/com/zhy/magicviewpager/transformer/RotateDownPageTransformer.java index 66d0bcf..c6c1234 100644 --- a/library/src/main/java/com/zhy/magicviewpager/transformer/RotateDownPageTransformer.java +++ b/library/src/main/java/com/zhy/magicviewpager/transformer/RotateDownPageTransformer.java @@ -2,6 +2,7 @@ import android.annotation.TargetApi; import android.os.Build; +import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.view.View; @@ -37,30 +38,43 @@ public void pageTransform(View view, float position) if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. - view.setRotation(mMaxRotate * -1); - view.setPivotX(view.getWidth()); - view.setPivotY(view.getHeight()); +// view.setRotation(mMaxRotate * -1); +// view.setPivotX(view.getWidth()); +// view.setPivotY(view.getHeight()); + ViewCompat.setRotation(view,mMaxRotate * -1); + ViewCompat.setPivotX(view,view.getWidth()); + ViewCompat.setPivotY(view,view.getHeight()); } else if (position <= 1) { // [-1,1] if (position < 0)//[0,-1] { - view.setPivotX(view.getWidth() * (DEFAULT_CENTER + DEFAULT_CENTER * (-position))); - view.setPivotY(view.getHeight()); - view.setRotation(mMaxRotate * position); +// view.setPivotX(view.getWidth() * (DEFAULT_CENTER + DEFAULT_CENTER * (-position))); +// view.setPivotY(view.getHeight()); +// view.setRotation(mMaxRotate * position); + ViewCompat.setRotation(view,view.getWidth() * (DEFAULT_CENTER + DEFAULT_CENTER * (-position))); + ViewCompat.setPivotY(view,view.getHeight()); + ViewCompat.setRotation(view,mMaxRotate * position); + } else//[1,0] { - view.setPivotX(view.getWidth() * DEFAULT_CENTER * (1 - position)); - view.setPivotY(view.getHeight()); - view.setRotation(mMaxRotate * position); +// view.setPivotX(view.getWidth() * DEFAULT_CENTER * (1 - position)); +// view.setPivotY(view.getHeight()); +// view.setRotation(mMaxRotate * position); + ViewCompat.setPivotX(view,view.getWidth() * DEFAULT_CENTER * (1 - position)); + ViewCompat.setPivotY(view,view.getHeight()); + ViewCompat.setRotation(view,mMaxRotate * position); } } else { // (1,+Infinity] // This page is way off-screen to the right. - view.setRotation(mMaxRotate); - view.setPivotX(view.getWidth() * 0); - view.setPivotY(view.getHeight()); +// view.setRotation(mMaxRotate); +// view.setPivotX(view.getWidth() * 0); +// view.setPivotY(view.getHeight()); + ViewCompat.setRotation(view,mMaxRotate); + ViewCompat.setPivotX(view,view.getWidth() * 0); + ViewCompat.setPivotY(view,view.getHeight()); } } } \ No newline at end of file diff --git a/library/src/main/java/com/zhy/magicviewpager/transformer/RotateUpPageTransformer.java b/library/src/main/java/com/zhy/magicviewpager/transformer/RotateUpPageTransformer.java index 1496c2a..3591afa 100644 --- a/library/src/main/java/com/zhy/magicviewpager/transformer/RotateUpPageTransformer.java +++ b/library/src/main/java/com/zhy/magicviewpager/transformer/RotateUpPageTransformer.java @@ -2,6 +2,7 @@ import android.annotation.TargetApi; import android.os.Build; +import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.view.View; @@ -37,31 +38,44 @@ public void pageTransform(View view, float position) if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. - view.setRotation(mMaxRotate); - view.setPivotX(view.getWidth()); - view.setPivotY(0); +// view.setRotation(mMaxRotate); +// view.setPivotX(view.getWidth()); +// view.setPivotY(0); + ViewCompat.setRotation(view,mMaxRotate); + ViewCompat.setPivotX(view,view.getWidth()); + ViewCompat.setPivotY(view,0); } else if (position <= 1) // a页滑动至b页 ; a页从 0.0 ~ -1 ;b页从1 ~ 0.0 { // [-1,1] // Modify the default slide transition to shrink the page as well if (position < 0)//[0,-1] { - view.setPivotX(view.getWidth() * (0.5f + 0.5f * (-position))); - view.setPivotY(0); - view.setRotation(-mMaxRotate * position); +// view.setPivotX(view.getWidth() * (0.5f + 0.5f * (-position))); +// view.setPivotY(0); +// view.setRotation(-mMaxRotate * position); + + ViewCompat.setPivotX(view,view.getWidth() * (0.5f + 0.5f * (-position))); + ViewCompat.setPivotY(view,0); + ViewCompat.setRotation(view,-mMaxRotate * position); } else//[1,0] { - view.setPivotX(view.getWidth() * 0.5f * (1 - position)); - view.setPivotY(0); - view.setRotation(-mMaxRotate * position); +// view.setPivotX(view.getWidth() * 0.5f * (1 - position)); +// view.setPivotY(0); +// view.setRotation(-mMaxRotate * position); + ViewCompat.setPivotX(view,view.getWidth() * 0.5f * (1 - position)); + ViewCompat.setPivotY(view,0); + ViewCompat.setRotation(view,-mMaxRotate * position); } } else { // (1,+Infinity] // This page is way off-screen to the right. // ViewHelper.setRotation(view, ROT_MAX); - view.setRotation(-mMaxRotate); - view.setPivotX(0); - view.setPivotY(0); +// view.setRotation(-mMaxRotate); +// view.setPivotX(0); +// view.setPivotY(0); + ViewCompat.setRotation(view,-mMaxRotate); + ViewCompat.setPivotY(view,0); + ViewCompat.setPivotY(view,0); } } } \ No newline at end of file diff --git a/library/src/main/java/com/zhy/magicviewpager/transformer/RotateYTransformer.java b/library/src/main/java/com/zhy/magicviewpager/transformer/RotateYTransformer.java index e9ac808..5cee189 100644 --- a/library/src/main/java/com/zhy/magicviewpager/transformer/RotateYTransformer.java +++ b/library/src/main/java/com/zhy/magicviewpager/transformer/RotateYTransformer.java @@ -2,6 +2,7 @@ import android.annotation.TargetApi; import android.os.Build; +import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.view.View; @@ -38,31 +39,40 @@ public void pageTransform(View view, float position) if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. - view.setRotationY(-1 * mMaxRotate); - view.setPivotX(view.getWidth()); - view.setPivotX(view.getWidth()); +// view.setRotationY(-1 * mMaxRotate); +// view.setPivotX(view.getWidth()); +// view.setPivotX(view.getWidth()); + ViewCompat.setRotationY(view,-1 * mMaxRotate); + ViewCompat.setPivotX(view,view.getWidth()); + ViewCompat.setPivotX(view,view.getWidth()); } else if (position <= 1) { // [-1,1] // Modify the default slide transition to shrink the page as well - view.setRotationY(position * mMaxRotate); - +// view.setRotationY(position * mMaxRotate); + ViewCompat.setRotationY(view,position * mMaxRotate); if (position < 0)//[0,-1] { - view.setPivotX(view.getWidth() * (DEFAULT_CENTER + DEFAULT_CENTER * (-position))); - view.setPivotX(view.getWidth()); +// view.setPivotX(view.getWidth() * (DEFAULT_CENTER + DEFAULT_CENTER * (-position))); +// view.setPivotX(view.getWidth()); + ViewCompat.setPivotX(view,view.getWidth() * (DEFAULT_CENTER + DEFAULT_CENTER * (-position))); + ViewCompat.setPivotX(view,view.getWidth()); } else//[1,0] { - view.setPivotX(view.getWidth() * DEFAULT_CENTER * (1 - position)); - view.setPivotX(0); +// view.setPivotX(view.getWidth() * DEFAULT_CENTER * (1 - position)); +// view.setPivotX(0); + ViewCompat.setPivotX(view,view.getWidth() * DEFAULT_CENTER * (1 - position)); + ViewCompat.setPivotX(view,0); } // Scale the page down (between MIN_SCALE and 1) } else { // (1,+Infinity] // This page is way off-screen to the right. - view.setRotationY(1 * mMaxRotate); - view.setPivotX(0); +// view.setRotationY(1 * mMaxRotate); +// view.setPivotX(0); + ViewCompat.setRotationY(view, 1 * mMaxRotate); + ViewCompat.setPivotY(view,0); } } } diff --git a/library/src/main/java/com/zhy/magicviewpager/transformer/ScaleInTransformer.java b/library/src/main/java/com/zhy/magicviewpager/transformer/ScaleInTransformer.java index d4b2210..d72edbf 100644 --- a/library/src/main/java/com/zhy/magicviewpager/transformer/ScaleInTransformer.java +++ b/library/src/main/java/com/zhy/magicviewpager/transformer/ScaleInTransformer.java @@ -2,6 +2,7 @@ import android.annotation.TargetApi; import android.os.Build; +import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.view.View; @@ -39,14 +40,21 @@ public void pageTransform(View view, float position) int pageWidth = view.getWidth(); int pageHeight = view.getHeight(); - view.setPivotY(pageHeight / 2); - view.setPivotX(pageWidth / 2); +// view.setPivotY(pageHeight / 2); +// view.setPivotX(pageWidth / 2); + ViewCompat.setPivotY(view,pageHeight / 2); + ViewCompat.setPivotX(view,pageWidth /2); + if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. - view.setScaleX(mMinScale); - view.setScaleY(mMinScale); - view.setPivotX(pageWidth); +// view.setScaleX(mMinScale); +// view.setScaleY(mMinScale); +// view.setPivotX(pageWidth); + ViewCompat.setScaleX(view,mMinScale); + ViewCompat.setScaleY(view,mMinScale); + ViewCompat.setPivotX(view,pageWidth); + } else if (position <= 1) { // [-1,1] // Modify the default slide transition to shrink the page as well @@ -54,25 +62,35 @@ public void pageTransform(View view, float position) { float scaleFactor = (1 + position) * (1 - mMinScale) + mMinScale; - view.setScaleX(scaleFactor); - view.setScaleY(scaleFactor); +// view.setScaleX(scaleFactor); +// view.setScaleY(scaleFactor); +// +// view.setPivotX(pageWidth * (DEFAULT_CENTER + (DEFAULT_CENTER * -position))); - view.setPivotX(pageWidth * (DEFAULT_CENTER + (DEFAULT_CENTER * -position))); + ViewCompat.setScaleX(view,scaleFactor); + ViewCompat.setScaleY(view,scaleFactor); + ViewCompat.setPivotX(view,pageWidth * (DEFAULT_CENTER + (DEFAULT_CENTER * -position))); } else //1-2:2[1,0] ;2-1:2[0,1] { float scaleFactor = (1 - position) * (1 - mMinScale) + mMinScale; - view.setScaleX(scaleFactor); - view.setScaleY(scaleFactor); - view.setPivotX(pageWidth * ((1 - position) * DEFAULT_CENTER)); +// view.setScaleX(scaleFactor); +// view.setScaleY(scaleFactor); +// view.setPivotX(pageWidth * ((1 - position) * DEFAULT_CENTER)); + ViewCompat.setScaleX(view,scaleFactor); + ViewCompat.setScaleY(view,scaleFactor); + ViewCompat.setPivotX(view,pageWidth * ((1 - position) * DEFAULT_CENTER)); } } else { // (1,+Infinity] - view.setPivotX(0); - view.setScaleX(mMinScale); - view.setScaleY(mMinScale); +// view.setPivotX(0); +// view.setScaleX(mMinScale); +// view.setScaleY(mMinScale); + ViewCompat.setPivotX(view,0); + ViewCompat.setScaleX(view,mMinScale); + ViewCompat.setScaleY(view,mMinScale); } } } diff --git a/library/src/main/java/com/zhy/magicviewpager/widget/Hacky.java b/library/src/main/java/com/zhy/magicviewpager/widget/Hacky.java new file mode 100644 index 0000000..0326ff1 --- /dev/null +++ b/library/src/main/java/com/zhy/magicviewpager/widget/Hacky.java @@ -0,0 +1,59 @@ +package com.zhy.magicviewpager.widget; + +import android.content.Context; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; +import android.view.MotionEvent; + +/** + * usage: + * author: kHRYSTAL + * create time: 16/5/7 + * update time: + * email: 723526676@qq.com + */ +public class Hacky extends ViewPager{ + + private boolean isLocked; + + public Hacky(Context context) { + super(context); + isLocked = false; + } + + public Hacky(Context context, AttributeSet attrs) { + super(context, attrs); + isLocked = false; + } + + @Override + public boolean onInterceptHoverEvent(MotionEvent event) { + if (!isLocked){ + try { + return super.onInterceptHoverEvent(event); + }catch (IllegalArgumentException e){ + e.printStackTrace(); + return false; + } + } + return false; + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + return !isLocked && super.onTouchEvent(ev); + } + + public void toggleLock(){ + isLocked = !isLocked; + } + + public void setLocked(boolean isLocked){ + this.isLocked = isLocked; + } + + public boolean isLocked(){ + return isLocked; + } + +} diff --git a/library/src/main/java/com/zhy/magicviewpager/widget/MagicViewPager.java b/library/src/main/java/com/zhy/magicviewpager/widget/MagicViewPager.java new file mode 100644 index 0000000..7977a50 --- /dev/null +++ b/library/src/main/java/com/zhy/magicviewpager/widget/MagicViewPager.java @@ -0,0 +1,213 @@ +package com.zhy.magicviewpager.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Point; +import android.os.Build; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPager; +import android.support.v4.view.ViewPager.OnPageChangeListener; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.widget.FrameLayout; + +import com.zhy.magicviewpager.R; +import com.zhy.magicviewpager.transformer.AlphaPageTransformer; +import com.zhy.magicviewpager.transformer.BasePageTransformer; +import com.zhy.magicviewpager.transformer.RotateDownPageTransformer; +import com.zhy.magicviewpager.transformer.RotateUpPageTransformer; +import com.zhy.magicviewpager.transformer.RotateYTransformer; +import com.zhy.magicviewpager.transformer.ScaleInTransformer; + +/** + * usage: 当ViewPager中Fragment需要纵向滑动 同时需要加入transform时 使用该类 + * author: kHRYSTAL + * create time: 16/5/7 + * update time: + * email: 723526676@qq.com + */ +public class MagicViewPager extends FrameLayout implements OnPageChangeListener{ + + + private int mPagerMargin = 0; + private int mPaddingLeft = 130; + private int mPaddingRight = 130; + private int mPageLimit = 3; + private int mTransformType; + + + private Hacky mPager; + boolean mNeedRedraw = false; + private Point mCenter = new Point(); + private Point mInitialTouch = new Point(); + private BasePageTransformer mPageTransformer; + private OnPageChangeListener mListener; + + + public MagicViewPager(Context context) { + this(context,null,0); + } + + public MagicViewPager(Context context, AttributeSet attrs) { + this(context, attrs,0); + } + + public MagicViewPager(Context context,AttributeSet attrs,int defStyle){ + super(context, attrs,defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.MagicViewPager); + mPageLimit = a.getInteger( + R.styleable.MagicViewPager_offscreenPageLimit, mPageLimit); + mPagerMargin = a.getInteger(R.styleable.MagicViewPager_pagerMargin, + mPagerMargin); + mPaddingLeft = a.getInteger(R.styleable.MagicViewPager_paddingLeft, + mPaddingLeft); + mPaddingRight = a.getInteger(R.styleable.MagicViewPager_paddingRight, + mPaddingRight); + mTransformType = a.getInteger(R.styleable.MagicViewPager_transformType,-1); + a.recycle(); + View.inflate(context,R.layout.magic_view_pager,this); + mPager = (Hacky) findViewById(R.id.real_page); + mPager.setOffscreenPageLimit(mPageLimit); + mPager.setPageMargin(mPagerMargin); + mPager.setOnPageChangeListener(this); + setDefaultTransform(mTransformType); + init(context); + } + + public void setTransformType(@TransformType.TransformTypeChecker int type){ + mTransformType = type; + setDefaultTransform(type); + } + + private void setDefaultTransform(@TransformType.TransformTypeChecker int type) { + switch (type){ + case TransformType.ALPHA_PAGETRANSFORMER: + mPageTransformer = new AlphaPageTransformer(); + break; + case TransformType.ROATE_DOWN_PAGETRANSFORMER: + mPageTransformer = new RotateDownPageTransformer(); + break; + case TransformType.ROATE_UP_PAGETRANSFORMER: + mPageTransformer = new RotateUpPageTransformer(); + break; + case TransformType.ROTATE_Y_TRANSFORMER: + mPageTransformer = new RotateYTransformer(); + break; + case TransformType.SCALE_IN_TRANSFORMER: + mPageTransformer = new ScaleInTransformer(); + break; + default: + mPageTransformer = null; + break; + } + } + + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + private void init(Context context) { + setClipChildren(false); + if (Build.VERSION.SDK_INT >= 11) + setLayerType(View.LAYER_TYPE_SOFTWARE,null); + } + + public Hacky getViewPager(){ + return mPager; + } + + public void setMagicOffscreenPageLimit(int pagerDis) { + if (pagerDis < 3) { + throw new IllegalArgumentException( + "the offscreen page limit must >3"); + } + if (mPager!=null) + mPager.setOffscreenPageLimit(pagerDis); + } + + public void setMagicPagerMargin(int pagerMargin) { + mPager.setPageMargin(pagerMargin); + } + + public void setPageTransformer(BasePageTransformer transformer){ + mPageTransformer = transformer; + } + + public BasePageTransformer getPageTransformer() { + return mPageTransformer; + } + + public void setOnPageChangeListener(OnPageChangeListener listener){ + mListener = listener; + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mCenter.x = w/2; + mCenter.y = h/2; + } + + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getAction()){ + case MotionEvent.ACTION_DOWN: + mInitialTouch.x = (int)event.getX(); + mInitialTouch.y = (int)event.getY(); + break; + default: + event.offsetLocation(mCenter.x - mInitialTouch.x,mCenter.y - mInitialTouch.y); + break; + } + return mPager.dispatchTouchEvent(event); + } + + + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + final int scrollX = mPager.getScrollX(); + final int childCount = mPager.getChildCount(); + if (mPageTransformer!=null) { + for (int i = 0; i < childCount; i++) { + final View child = mPager.getChildAt(i); + final ViewPager.LayoutParams lp = (ViewPager.LayoutParams) child.getLayoutParams(); + if (lp.isDecor) + continue; + final float transformPos = (float) (child.getLeft() - scrollX) / child.getWidth(); + mPageTransformer.transformPage(child, transformPos); + } + } + if (mNeedRedraw) + invalidate(); + if (mListener != null) + mListener.onPageScrolled(position,positionOffset,positionOffsetPixels); + } + + @Override + public void onPageSelected(int position) { + if (mListener != null) + mListener.onPageSelected(position); + + } + + @Override + public void onPageScrollStateChanged(int state) { + mNeedRedraw = (state != ViewPager.SCROLL_STATE_IDLE); + if (mListener != null) + mListener.onPageScrollStateChanged(state); + } + + + public interface OnPageChangeListener{ + + void onPageScrolled(int position,float positionOffset,int positionOffsetPixels); + + void onPageSelected(int position); + + void onPageScrollStateChanged(int state); + } +} diff --git a/library/src/main/java/com/zhy/magicviewpager/widget/TransformType.java b/library/src/main/java/com/zhy/magicviewpager/widget/TransformType.java new file mode 100644 index 0000000..a05f0b5 --- /dev/null +++ b/library/src/main/java/com/zhy/magicviewpager/widget/TransformType.java @@ -0,0 +1,44 @@ +package com.zhy.magicviewpager.widget; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * usage: MagicViewPager的Transform类型 + * author: kHRYSTAL + * create time: 16/5/7 + * update time: + * email: 723526676@qq.com + */ +public class TransformType { + /** + * 多少种Transform类型 + */ + public static final int TYPE_COUNT = 6; + + + + @TransformTypeChecker + public static final int NON_PAGETRANSFORMER = 0; + + @TransformTypeChecker + public static final int ALPHA_PAGETRANSFORMER = 1; + + @TransformTypeChecker + public static final int ROATE_DOWN_PAGETRANSFORMER = 2; + + @TransformTypeChecker + public static final int ROATE_UP_PAGETRANSFORMER = 3; + + @TransformTypeChecker + public static final int ROTATE_Y_TRANSFORMER = 4; + + @TransformTypeChecker + public static final int SCALE_IN_TRANSFORMER = 5; + + + @Retention(RetentionPolicy.SOURCE) + public @interface TransformTypeChecker{ + + } +} diff --git a/library/src/main/res/layout/magic_view_pager.xml b/library/src/main/res/layout/magic_view_pager.xml new file mode 100644 index 0000000..0f735e0 --- /dev/null +++ b/library/src/main/res/layout/magic_view_pager.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml new file mode 100644 index 0000000..fc6089b --- /dev/null +++ b/library/src/main/res/values/attrs.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file From 86d38d0b98d060223505d895c2d6787436a4fc67 Mon Sep 17 00:00:00 2001 From: kHRYSTAL <723526676@qq.com> Date: Sat, 7 May 2016 17:29:42 +0800 Subject: [PATCH 2/3] update IntDef --- .../java/com/zhy/magicviewpager/widget/TransformType.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/com/zhy/magicviewpager/widget/TransformType.java b/library/src/main/java/com/zhy/magicviewpager/widget/TransformType.java index a05f0b5..3033be6 100644 --- a/library/src/main/java/com/zhy/magicviewpager/widget/TransformType.java +++ b/library/src/main/java/com/zhy/magicviewpager/widget/TransformType.java @@ -1,5 +1,7 @@ package com.zhy.magicviewpager.widget; +import android.support.annotation.IntDef; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -14,8 +16,7 @@ public class TransformType { /** * 多少种Transform类型 */ - public static final int TYPE_COUNT = 6; - + public static final int DEFAULT_TYPE_COUNT = 6; @TransformTypeChecker @@ -36,7 +37,8 @@ public class TransformType { @TransformTypeChecker public static final int SCALE_IN_TRANSFORMER = 5; - + @IntDef({NON_PAGETRANSFORMER,ALPHA_PAGETRANSFORMER,ROATE_DOWN_PAGETRANSFORMER,ROATE_UP_PAGETRANSFORMER, + ROTATE_Y_TRANSFORMER,SCALE_IN_TRANSFORMER}) @Retention(RetentionPolicy.SOURCE) public @interface TransformTypeChecker{ From 065d6fb7673196d8e2bdb0df4ef15df849ada7a6 Mon Sep 17 00:00:00 2001 From: kHRYSTAL <723526676@qq.com> Date: Sat, 7 May 2016 21:22:48 +0800 Subject: [PATCH 3/3] update code --- app/src/main/AndroidManifest.xml | 2 +- .../sample/SupportScrollActivity.java | 79 +++-------- .../sample/SupportScrollFragment.java | 124 ++++++++++++++++++ .../res/layout/support_scroll_activity.xml | 8 ++ ...tivity.xml => support_scroll_fragment.xml} | 7 +- .../magicviewpager/widget/MagicViewPager.java | 25 +++- 6 files changed, 172 insertions(+), 73 deletions(-) create mode 100644 app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollFragment.java create mode 100644 app/src/main/res/layout/support_scroll_activity.xml rename app/src/main/res/layout/{scroll_activity.xml => support_scroll_fragment.xml} (67%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 66a28bd..ea20013 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,7 +16,7 @@ - + diff --git a/app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollActivity.java b/app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollActivity.java index cf1a9c1..accb4ab 100644 --- a/app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollActivity.java +++ b/app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollActivity.java @@ -1,73 +1,24 @@ package com.zhy.magicviewpager.sample; -import android.content.Intent; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; -import android.view.ViewGroup; -import android.widget.Toast; -import com.zhy.magicviewpager.transformer.AlphaPageTransformer; -import com.zhy.magicviewpager.transformer.NonPageTransformer; -import com.zhy.magicviewpager.transformer.RotateDownPageTransformer; -import com.zhy.magicviewpager.transformer.RotateUpPageTransformer; -import com.zhy.magicviewpager.transformer.RotateYTransformer; -import com.zhy.magicviewpager.transformer.ScaleInTransformer; -import com.zhy.magicviewpager.widget.MagicViewPager; - -import java.util.ArrayList; public class SupportScrollActivity extends AppCompatActivity { - private ArrayList list; - private MagicViewPager mViewPager; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.scroll_activity); - mViewPager = (MagicViewPager) findViewById(R.id.viewpager); - list = new ArrayList<>(); - for (int i = 0; i < 5; i++) { - list.add(""+i); - } - - SimplePagerAdapter adapter = new SimplePagerAdapter(getSupportFragmentManager()); - mViewPager.getViewPager().setAdapter(adapter); - adapter.notifyDataSetChanged(); + setContentView(R.layout.support_scroll_activity); } - public class SimplePagerAdapter extends FragmentPagerAdapter { - public SimplePagerAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public int getCount() { - return 5; - } - - @Override - public Object instantiateItem(ViewGroup container, int position) { - return super.instantiateItem(container, position); - } - - @Override - public void destroyItem(ViewGroup container, int position, Object object) { - } - - @Override - public Fragment getItem(int position) { - return ScrollFragment.getInstance(); - } - } - @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -81,39 +32,39 @@ public boolean onCreateOptionsMenu(Menu menu) public boolean onOptionsItemSelected(MenuItem item) { String title = item.getTitle().toString(); + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + Bundle bundle = new Bundle(); if ("RotateDown".equals(title)) { - mViewPager.setPageTransformer(new RotateDownPageTransformer()); + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,2); } else if ("RotateUp".equals(title)) { - mViewPager.setPageTransformer(new RotateUpPageTransformer()); + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,3); } else if ("RotateY".equals(title)) { - mViewPager.setPageTransformer(new RotateYTransformer()); + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,4); } else if ("Standard".equals(title)) { - mViewPager.setClipChildren(false); - mViewPager.setPageTransformer(null); + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,0); } else if ("Alpha".equals(title)) { - mViewPager.setClipChildren(false); - mViewPager.setPageTransformer(new AlphaPageTransformer()); + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,1); } else if ("ScaleIn".equals(title)) { - mViewPager.setPageTransformer(new ScaleInTransformer()); + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,5); } else if ("RotateDown and Alpha".equals(title)) { - mViewPager.setPageTransformer(new RotateDownPageTransformer(new AlphaPageTransformer())); + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,6); }else if ("RotateDown and Alpha And ScaleIn".equals(title)) { - mViewPager.setPageTransformer(new RotateDownPageTransformer(new AlphaPageTransformer(new ScaleInTransformer()))); + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,7); }else if ("Add Transform Can Vertical Scroll".equals(title)) { onBackPressed(); } - + fragmentTransaction.replace(R.id.fragment_container,SupportScrollFragment.getInstance(bundle)); + fragmentTransaction.commit(); setTitle(title); - return true; } } diff --git a/app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollFragment.java b/app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollFragment.java new file mode 100644 index 0000000..18594a2 --- /dev/null +++ b/app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollFragment.java @@ -0,0 +1,124 @@ +package com.zhy.magicviewpager.sample; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.zhy.magicviewpager.transformer.AlphaPageTransformer; +import com.zhy.magicviewpager.transformer.RotateDownPageTransformer; +import com.zhy.magicviewpager.transformer.ScaleInTransformer; +import com.zhy.magicviewpager.widget.MagicViewPager; +import com.zhy.magicviewpager.widget.TransformType; + +import java.util.ArrayList; + +/** + * usage: + * author: kHRYSTAL + * create time: 16/5/7 + * update time: + * email: 723526676@qq.com + */ +public class SupportScrollFragment extends Fragment{ + + public static final String TRANSFORM_TYPE = "transform_type"; + + private ArrayList list; + private MagicViewPager mViewPager; + private SimplePagerAdapter mAdapter; + private static int mTransformType; + + + public static Fragment getInstance(Bundle bundle) { + SupportScrollFragment fragment = new SupportScrollFragment(); + mTransformType = bundle.getInt(TRANSFORM_TYPE); + return fragment; + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.support_scroll_fragment,container,false); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initView(view); + } + + private void initView(View view) { + mViewPager = (MagicViewPager)view.findViewById(R.id.viewpager); + list = new ArrayList<>(); + mAdapter = new SimplePagerAdapter(getChildFragmentManager()); + + mViewPager.setAdapter(mAdapter); + mViewPager.setMagicPagerMargin(20); + setTransForm(mTransformType); + } + + private void setTransForm(int type) { + Log.e("SupportFragment",""+type); + switch (type){ + case 0: + mViewPager.setTransformType(TransformType.NON_PAGETRANSFORMER); + break; + case 1: + mViewPager.setTransformType(TransformType.ALPHA_PAGETRANSFORMER); + break; + case 2: + mViewPager.setTransformType(TransformType.ROATE_DOWN_PAGETRANSFORMER); + break; + case 3: + mViewPager.setTransformType(TransformType.ROATE_UP_PAGETRANSFORMER); + break; + case 4: + mViewPager.setTransformType(TransformType.ROTATE_Y_TRANSFORMER); + break; + case 5: + mViewPager.setTransformType(TransformType.SCALE_IN_TRANSFORMER); + break; + case 6: + mViewPager.setPageTransformer(new RotateDownPageTransformer(new AlphaPageTransformer())); + break; + case 7: + mViewPager.setPageTransformer(new RotateDownPageTransformer(new AlphaPageTransformer(new ScaleInTransformer()))); + + break; + } + } + + public class SimplePagerAdapter extends FragmentPagerAdapter { + + + public SimplePagerAdapter(FragmentManager fm) { + super(fm); + Log.e("SimplePagerAdapter","init"); + } + + @Override + public int getCount() { + return 5; + } + + @Override + public Object instantiateItem(ViewGroup container, int position) { + return super.instantiateItem(container, position); + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + } + + @Override + public Fragment getItem(int position) { + return ScrollFragment.getInstance(); + } + } +} diff --git a/app/src/main/res/layout/support_scroll_activity.xml b/app/src/main/res/layout/support_scroll_activity.xml new file mode 100644 index 0000000..2291427 --- /dev/null +++ b/app/src/main/res/layout/support_scroll_activity.xml @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/scroll_activity.xml b/app/src/main/res/layout/support_scroll_fragment.xml similarity index 67% rename from app/src/main/res/layout/scroll_activity.xml rename to app/src/main/res/layout/support_scroll_fragment.xml index f6c196a..11e6472 100644 --- a/app/src/main/res/layout/scroll_activity.xml +++ b/app/src/main/res/layout/support_scroll_fragment.xml @@ -1,13 +1,10 @@ + android:layout_height="match_parent"> diff --git a/library/src/main/java/com/zhy/magicviewpager/widget/MagicViewPager.java b/library/src/main/java/com/zhy/magicviewpager/widget/MagicViewPager.java index 7977a50..bcdb176 100644 --- a/library/src/main/java/com/zhy/magicviewpager/widget/MagicViewPager.java +++ b/library/src/main/java/com/zhy/magicviewpager/widget/MagicViewPager.java @@ -2,9 +2,11 @@ import android.annotation.TargetApi; import android.content.Context; +import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Point; import android.os.Build; +import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; @@ -16,6 +18,7 @@ import com.zhy.magicviewpager.R; import com.zhy.magicviewpager.transformer.AlphaPageTransformer; import com.zhy.magicviewpager.transformer.BasePageTransformer; +import com.zhy.magicviewpager.transformer.NonPageTransformer; import com.zhy.magicviewpager.transformer.RotateDownPageTransformer; import com.zhy.magicviewpager.transformer.RotateUpPageTransformer; import com.zhy.magicviewpager.transformer.RotateYTransformer; @@ -28,6 +31,7 @@ * update time: * email: 723526676@qq.com */ +@SuppressWarnings("ResourceType") public class MagicViewPager extends FrameLayout implements OnPageChangeListener{ @@ -35,7 +39,7 @@ public class MagicViewPager extends FrameLayout implements OnPageChangeListener{ private int mPaddingLeft = 130; private int mPaddingRight = 130; private int mPageLimit = 3; - private int mTransformType; + @TransformType.TransformTypeChecker private int mTransformType = TransformType.NON_PAGETRANSFORMER; private Hacky mPager; @@ -54,6 +58,7 @@ public MagicViewPager(Context context, AttributeSet attrs) { this(context, attrs,0); } + @SuppressWarnings("ResourceType") public MagicViewPager(Context context,AttributeSet attrs,int defStyle){ super(context, attrs,defStyle); @@ -67,7 +72,7 @@ public MagicViewPager(Context context,AttributeSet attrs,int defStyle){ mPaddingLeft); mPaddingRight = a.getInteger(R.styleable.MagicViewPager_paddingRight, mPaddingRight); - mTransformType = a.getInteger(R.styleable.MagicViewPager_transformType,-1); + mTransformType = a.getInteger(R.styleable.MagicViewPager_transformType,TransformType.NON_PAGETRANSFORMER); a.recycle(); View.inflate(context,R.layout.magic_view_pager,this); mPager = (Hacky) findViewById(R.id.real_page); @@ -78,6 +83,8 @@ public MagicViewPager(Context context,AttributeSet attrs,int defStyle){ init(context); } + + public void setTransformType(@TransformType.TransformTypeChecker int type){ mTransformType = type; setDefaultTransform(type); @@ -104,6 +111,7 @@ private void setDefaultTransform(@TransformType.TransformTypeChecker int type) { mPageTransformer = null; break; } + requestLayout(); } @@ -118,6 +126,12 @@ public Hacky getViewPager(){ return mPager; } + public void setAdapter(PagerAdapter adapter){ + if (mPager != null) + mPager.setAdapter(adapter); + else throw new NullPointerException("MagicViewPager's Hacky is null"); + } + public void setMagicOffscreenPageLimit(int pagerDis) { if (pagerDis < 3) { throw new IllegalArgumentException( @@ -131,7 +145,7 @@ public void setMagicPagerMargin(int pagerMargin) { mPager.setPageMargin(pagerMargin); } - public void setPageTransformer(BasePageTransformer transformer){ + public void setPageTransformer(BasePageTransformer transformer) { mPageTransformer = transformer; } @@ -180,6 +194,11 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse final float transformPos = (float) (child.getLeft() - scrollX) / child.getWidth(); mPageTransformer.transformPage(child, transformPos); } + }else { + for (int i = 0; i < childCount; i++) { + final View child = mPager.getChildAt(i); + child.requestLayout(); + } } if (mNeedRedraw) invalidate();