parent
81d0b068d6
commit
93bb0fb2b8
@ -0,0 +1,94 @@ |
|||||||
|
--- |
||||||
|
ViewPager |
||||||
|
--- |
||||||
|
|
||||||
|
#### 目录 |
||||||
|
|
||||||
|
1. 思维导图 |
||||||
|
2. 前言 |
||||||
|
3. 自定义 PageTransform |
||||||
|
4. 常见问题 |
||||||
|
5. 参考 |
||||||
|
|
||||||
|
#### 思维导图 |
||||||
|
|
||||||
|
#### 前言 |
||||||
|
|
||||||
|
关于 ViewPager 的使用就不多说了,相信大家都会玩。写这篇文章的主要目的在于总结一下 PageTransform 该怎么玩?它是用来控制切换动画。 |
||||||
|
|
||||||
|
![](https://i.loli.net/2019/01/12/5c394dcc6c369.gif) |
||||||
|
|
||||||
|
这种效果现在已经很普遍了,重点就在自定义 PageTransform。 |
||||||
|
|
||||||
|
首先左右边距的显示该怎么做呢?很简单,只需两步: |
||||||
|
|
||||||
|
1. clipChildren 属性设置父布局不裁剪子 View |
||||||
|
|
||||||
|
```java |
||||||
|
<LinearLayout |
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android" |
||||||
|
android:orientation="vertical" |
||||||
|
android:clipChildren="false" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent"> |
||||||
|
<android.support.v4.view.ViewPager |
||||||
|
android:id="@+id/vp" |
||||||
|
android:clipChildren="false" |
||||||
|
android:layout_marginLeft="30dp" |
||||||
|
android:layout_marginRight="30dp" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="200dp"/> |
||||||
|
</LinearLayout> |
||||||
|
``` |
||||||
|
|
||||||
|
2. 设置页面边距 |
||||||
|
|
||||||
|
``` |
||||||
|
mViewPager.setPageMargin(30); |
||||||
|
``` |
||||||
|
|
||||||
|
完成之后页面就是以下效果了: |
||||||
|
|
||||||
|
![](https://i.loli.net/2019/01/12/5c3951ae75faf.png) |
||||||
|
|
||||||
|
切换的动画效果就得依赖于 PageTransform 了。 |
||||||
|
|
||||||
|
#### 自定义 PageTransform |
||||||
|
|
||||||
|
```java |
||||||
|
public class MyPageTransform implements ViewPager.PageTransformer { |
||||||
|
@Override |
||||||
|
public void transformPage(@NonNull View view, float v) { |
||||||
|
int width = view.getWidth(); |
||||||
|
//给不同状态的页面设置不停的效果 |
||||||
|
//通过 v 的值来判断页面所处的状态 |
||||||
|
if (v < -1) { //滑出得页面 |
||||||
|
view.setScrollX((int) (width * 0.75 * -1)); |
||||||
|
} else if (v <= 1) { |
||||||
|
//虽然代码一样,但是值不一样 |
||||||
|
if (v < 0) { //正在消失的页面 |
||||||
|
view.setScrollX((int) (width * 0.75 * v)); |
||||||
|
} else { //正在进入的页面 |
||||||
|
view.setScrollX((int) (width * 0.75 * v)); |
||||||
|
} |
||||||
|
} else { //划入的页面 |
||||||
|
view.setScrollX((int) (width * 0.75)); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
参数 View 是指当前的页面以及前后的页面,v 可以判断是哪个页面。v 的取值是[-1,1]。 |
||||||
|
|
||||||
|
当前页面 v 等于 0,前一个页面的值是 -1,后一个页面的值是 1。在滑动的时候,其实就是 v 值的变化。 |
||||||
|
|
||||||
|
#### 常见问题 |
||||||
|
|
||||||
|
##### FragmentPagerAdapter 和 FragmentStatePagerAdapter 的区别 |
||||||
|
|
||||||
|
FragmentPagerAdapter 对于不再需要的 fragment,选择调用 onDetach() 方法,仅销毁视图,不会销毁 fragment 实例。 |
||||||
|
|
||||||
|
FragmentStatePagerAdapter 会销毁不再需要的 fragment,当当前事务提交以后,会彻底的将 fragment 从当前 FragmentManager 中移除,state 表明,销毁时,会将其 onSaveInstanceState(Bundle outState) 中的 bundle 信息保存下来,当用户切换回来,可以通过该 bundle 恢复生成新的 fragment,也就是说,你可以在 onSaveInstanceState(Bundle outState) 方法中保存一些数据,在 onCreate 中进行恢复创建。 |
||||||
|
|
||||||
|
由此可见,使用 FragmentStatePagerAdapter 更省内存,但是销毁后新建也是需要时间的。一般情况下,如果是结合 TabLayout 展示四五个 Tab 的话,可以直接使用 FragmentPagerAdapter,如果 ViewPager 展示特别多的条目时,建议使用 FragmentStatePagerAdapter。 |
After Width: | Height: | Size: 65 KiB |
After Width: | Height: | Size: 40 KiB |
Loading…
Reference in new issue