Android用ViewPager实现一个中间大两边小可滑动的fragment卡片样式
时间: 2024-09-25 13:17:45 浏览: 84
Android中ViewPager实现滑动指示条及与Fragment的配合
在Android中,要实现一个中间大两边小的ViewPager滚动效果,通常会使用`ViewPager`配合`PagerAdapter`来管理Fragment,并通过自定义布局或者适配器来设计卡片式的外观。以下是一个简化的步骤:
1. **创建项目结构**:
- 在`activity_main.xml`布局文件中设置一个`CoordinatorLayout`作为根容器。
- 在`CoordinatorLayout`内添加一个`LinearLayout`作为水平布局,将`android:orientation="horizontal"`属性设为水平方向。
```xml
<androidx.coordinatorlayout.widget.CoordinatorLayout>
<LinearLayout
android:id="@+id/content_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<!-- 这里将会放ViewPager -->
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
```
2. **创建`PagerAdapter`**:
创建一个自定义的PagerAdapter,比如`MiddleCardPagerAdapter`,它可以根据指定的页面索引来调整显示的fragment大小。
```java
public class MiddleCardPagerAdapter extends FragmentStatePagerAdapter {
private int[] fragmentWidths; // 存储每个Fragment的宽度
public MiddleCardPagerAdapter(FragmentManager fm, int[] fragmentWidths) {
super(fm);
this.fragmentWidths = fragmentWidths;
}
@Override
public Fragment getItem(int position) {
return createFragment(position);
}
@Override
public int getCount() {
// 根据需求计算fragment的数量
return fragmentWidths.length;
}
private Fragment createFragment(int position) {
// 实现Fragment并设置其宽度为数组中的值
MyFragment myFragment = new MyFragment();
myFragment.setRetainInstance(true); // 保留实例以便于动态修改宽度
View itemView = LayoutInflater.from(context).inflate(R.layout.fragment_card, null);
ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams) itemView.getLayoutParams();
layoutParams.width = fragmentWidths[position];
itemView.setLayoutParams(layoutParams);
return myFragment;
}
}
```
3. **设置ViewPager**:
在MainActivity中初始化`ViewPager`, 设置Adapter,并监听滑动事件。
```java
ViewPager viewPager = findViewById(R.id.view_pager);
MiddleCardPagerAdapter adapter = new MiddleCardPagerAdapter(getSupportFragmentManager(), createFragmentWidthArray());
viewPager.setAdapter(adapter);
// 监听滑动,改变中间Fragment的宽度来模拟大小变化
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (position == 0 || position == adapter.getCount() - 1) { // 边缘位置不变
return;
}
MyFragment middleFragment = (MyFragment) viewPager.findFragmentByTag("middle_fragment");
if (middleFragment != null) {
middleFragment.updateWidth(positionOffset);
}
}
// 其他方法...
});
```
4. **自定义Fragment** (`MyFragment`):
`MyFragment`需要包含一个用于更新宽度的方法,并根据传入的值调整视图尺寸。
```java
public class MyFragment extends Fragment {
private View mView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_card, container, false);
// 初始化并添加宽度变化的相关逻辑
return mView;
}
public void updateWidth(float offset) {
// 根据offset百分比调整中间部分的宽度
ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams) mView.getLayoutParams();
layoutParams.width = Math.max(minWidth, (int) (mOriginalWidth * (1 + offset)));
mView.setLayoutParams(layoutParams);
}
}
阅读全文