diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 54cbce4..ea20013 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..accb4ab --- /dev/null +++ b/app/src/main/java/com/zhy/magicviewpager/sample/SupportScrollActivity.java @@ -0,0 +1,70 @@ +package com.zhy.magicviewpager.sample; + +import android.support.v4.app.FragmentTransaction; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; + + +public class SupportScrollActivity extends AppCompatActivity { + + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.support_scroll_activity); + } + + + + @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(); + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + Bundle bundle = new Bundle(); + if ("RotateDown".equals(title)) + { + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,2); + } else if ("RotateUp".equals(title)) + { + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,3); + } else if ("RotateY".equals(title)) + { + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,4); + } else if ("Standard".equals(title)) + { + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,0); + } else if ("Alpha".equals(title)) + { + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,1); + } else if ("ScaleIn".equals(title)) + { + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,5); + } else if ("RotateDown and Alpha".equals(title)) + { + bundle.putInt(SupportScrollFragment.TRANSFORM_TYPE,6); + }else if ("RotateDown and Alpha And ScaleIn".equals(title)) + { + 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/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_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/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/support_scroll_fragment.xml b/app/src/main/res/layout/support_scroll_fragment.xml new file mode 100644 index 0000000..11e6472 --- /dev/null +++ b/app/src/main/res/layout/support_scroll_fragment.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file 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..bcdb176 --- /dev/null +++ b/library/src/main/java/com/zhy/magicviewpager/widget/MagicViewPager.java @@ -0,0 +1,232 @@ +package com.zhy.magicviewpager.widget; + +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; +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.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; + +/** + * usage: 当ViewPager中Fragment需要纵向滑动 同时需要加入transform时 使用该类 + * author: kHRYSTAL + * create time: 16/5/7 + * update time: + * email: 723526676@qq.com + */ +@SuppressWarnings("ResourceType") +public class MagicViewPager extends FrameLayout implements OnPageChangeListener{ + + + private int mPagerMargin = 0; + private int mPaddingLeft = 130; + private int mPaddingRight = 130; + private int mPageLimit = 3; + @TransformType.TransformTypeChecker private int mTransformType = TransformType.NON_PAGETRANSFORMER; + + + 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); + } + + @SuppressWarnings("ResourceType") + 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,TransformType.NON_PAGETRANSFORMER); + 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; + } + requestLayout(); + } + + + @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 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( + "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); + } + }else { + for (int i = 0; i < childCount; i++) { + final View child = mPager.getChildAt(i); + child.requestLayout(); + } + } + 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..3033be6 --- /dev/null +++ b/library/src/main/java/com/zhy/magicviewpager/widget/TransformType.java @@ -0,0 +1,46 @@ +package com.zhy.magicviewpager.widget; + +import android.support.annotation.IntDef; + +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 DEFAULT_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; + + @IntDef({NON_PAGETRANSFORMER,ALPHA_PAGETRANSFORMER,ROATE_DOWN_PAGETRANSFORMER,ROATE_UP_PAGETRANSFORMER, + ROTATE_Y_TRANSFORMER,SCALE_IN_TRANSFORMER}) + @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