ViewPager在我们的实际工作中,用到的地方很多:比如banner图、tab等等,与我们工作息息相关。
ViewPager这个控件我们蹂躏了这么多年,他的内心也是愤怒的。所以它就怒吼一声,把他的哥哥 ViewPager2官方地址 喊来了,但他万万没有想到,它的哥哥逃不过我们的蹂躏,哈哈哈哈。
由于这一两年,短视频犹如一个点燃的彗星撞向地球,吸引了大部分人的注意力,所以对于的短视频的需求也就多了起来。比如:抖音、快手、小红书、微视等等。为了提高用户体验度,他们的视频播放都是采用了上下滑动,切换视频的方式。当然也有好多人使用了自定义RecyclerView或者自定义ViewPager实现了这个功能。但是ViewPager2是官方提供,直接自带实现的。
下边来看看我们怎么蹂躏ViewPager2。
dependencies {
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha06'
}
在实际的使用遇见了一个问题,发现 Androidx 与 Android support 库 不共存,那就support库转成Androidx。
解决方法:Androidx和Android support库共存问题解决
查看ViewPager2源码可知,ViewPager2继承ViewGroup,支持横向纵向。通过设置Orientation确定方向。
public final class ViewPager2 extends ViewGroup {
/** @hide */
@RestrictTo(LIBRARY_GROUP_PREFIX)
@Retention(SOURCE)
@IntDef({ORIENTATION_HORIZONTAL, ORIENTATION_VERTICAL})
public @interface Orientation {
}
}
内部是通过RecyclerView和LinearLayoutManager实现的
LinearLayoutManager mLayoutManager;
private int mPendingCurrentItem = NO_POSITION;
private Parcelable mPendingAdapterState;
private RecyclerView mRecyclerView;
private PagerSnapHelper mPagerSnapHelper;
private ScrollEventAdapter mScrollEventAdapter;
private FakeDrag mFakeDragger;
private PageTransformerAdapter mPageTransformerAdapter;
device-2019-07-12-174755.gif
device-2019-07-12-175011.gif
代码如下:
public class MainActivity extends AppCompatActivity {
private ViewPager2 vp;
private MyListAdapter mListAdapter;
private List<Integer> lists = new ArrayList<Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i < 100; i++) {
lists.add(Color.GRAY);
lists.add(Color.BLUE);
lists.add(Color.YELLOW);
lists.add(Color.RED);
lists.add(Color.GREEN);
lists.add(Color.BLACK);
}
vp = findViewById(R.id.vp);
//竖向滑动
//横向滑动
mListAdapter = new MyListAdapter(this, lists);
vp.setAdapter(mListAdapter);
}
}
import java.util.List;
public class MyListAdapter extends RecyclerView.Adapter {
Context context;
List<Integer> list;
MyListAdapter(Context context, List<Integer> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view_pager, parent, false);
final MyViewHolder mViewHolder = new MyViewHolder(v);
return mViewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
((MyViewHolder) holder).mCL.setBackgroundColor(list.get(position));
((MyViewHolder) holder).mTvShow.setText("当前显示 position = " + (position + 1));
((MyViewHolder) holder).itemView.setTag(position);
}
@Override
public int getItemCount() {
return list != null ? list.size() : 0;
}
class MyViewHolder extends RecyclerView.ViewHolder {
ConstraintLayout mCL;
TextView mTvShow;
public MyViewHolder(View itemView) {
super(itemView);
mTvShow = (TextView) itemView.findViewById(R.id.tv_Show);
mCL = (ConstraintLayout) itemView.findViewById(R.id.cl);
}
}
}
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!--<androidx.viewpager2.widget.ViewPager2-->
<!--android:id="@+id/vp"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="match_parent"-->
<!--android:orientation="vertical"-->
<!--tools:ignore="MissingConstraints" />-->
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cl"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_Show"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:text="aaaaaa"
android:textColor="#ffffffff"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>