Android实现评论栏随Recyclerview滑动左右移动

最近在玩一个叫“约会吧”的应用,也是在看直播app,默认下载安装的,安装点进去看这个应用做的不错,就留下来了。然后看他们动态详情页底部有一个效果:Recyclerview滑动到的评论列表的时候,底部点赞那栏会往左滑动,出现一个输入评论的栏;然后下拉到底部的时候输入评论栏会往右滑动,出现点赞栏。详细细节直接来看效果图吧。

其实这种效果现在在应用中还是很常见的,有上拉,toolbar、底部view隐藏,下拉显示,或者像现在约会吧这样左右滑动的效果。而且网上资料现在也有很多,有通过ObjectAnimation来实现的,这里我们通过另外一种方法来实现。仔细下看下这个效果,其实他就是view滚动的效果,想到Android里面的滚动,马上就能想到scroller类了,scroller有一个startScroll()方法,通过这个方法我们就可以滚动了。滚动问题解决了,那么这个效果就很简单了,进入页面时,把要显示view的先显示出来,不该显示的暂时放在屏幕外面,当滚动的时间,我们控制view进入屏幕或者退出屏幕。大概思路就是这样,下面我们就来实现这样的效果吧。

效果的实现

首先,我们根据上面的思路把布局给整出来。结构如下图:

这里说明下上面的图,分为3块来说,
- 当Recyclerview上拉的时候,屏幕内5位置的view会隐藏,也就是移动到屏幕外面的6位置,当Recyclerview下拉的时候,屏幕外面的6位置view又会回到5位置显示。
- 当Recyclerview上拉的时候,屏幕内的1位置的view会隐藏,也就是移动到屏幕外面的4位置,当Recyclerview下拉的时候,屏幕外面的4位置view会回到1位置显示。
- 当RecyclerView上拉的时候,而且设置为水平方向左右滑动的时候,屏幕内的1位置的view会移动到3位置,同时屏幕外面2位置view会移动到屏幕内1位置来显示,当RecyclerView下拉的时候,屏幕外的3位置会移动到屏幕内的1位置。1位置显示的view也会回到屏幕外的2位置隐藏。这也就是上面应用的效果。

布局效果和代码如下(这里添加两个按钮来切换底部方向的效果):

效果图                                        
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@android:color/white">
 <android.support.v7.widget.RecyclerView
  android:id="@+id/id_recyclerview"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  />
 <RelativeLayout
  android:id="@+id/id_horization_rl"
  android:layout_width="match_parent"
  android:layout_height="60dp"
  android:layout_alignParentBottom="true"
  android:orientation="horizontal"
  >
 <TextView
  android:id="@+id/id_bottom_float"
  android:layout_width="match_parent"
  android:layout_height="60dp"
  android:text="我是点赞操作布局"
  android:textSize="18sp"
  android:gravity="center"
  android:background="#E2E2E2">
 </TextView>
 <TextView
  android:id="@+id/id_bottom_comment"
  android:layout_width="match_parent"
  android:layout_height="60dp"
  android:text="我是评论输入布局"
  android:textSize="18sp"
  android:gravity="center"
  android:background="#FF4500">
 </TextView>
 </RelativeLayout>
 <TextView
  android:id="@+id/id_bottom_vertical"
  android:layout_width="match_parent"
  android:layout_height="60dp"
  android:text="你滑动,我随你而变"
  android:layout_alignParentBottom="true"
  android:background="#eeeeee"
  android:gravity="center"
  android:textSize="16sp"
  />
 <TextView
  android:id="@+id/id_top_vertical"
  android:layout_width="match_parent"
  android:layout_height="60dp"
  android:text="你滑动,我随你而变"
  android:background="#eeeeee"
  android:gravity="center"
  android:textSize="16sp" />
 <LinearLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:id="@+id/id_switch"
  android:orientation="vertical"
  android:layout_alignParentRight="true"
  android:layout_centerVertical="true">
  <TextView
   android:layout_width="wrap_content"
   android:layout_height="60dp"
   android:gravity="center"
   android:background="#eeeeee"
   android:text="切换底部水平动画"
   android:onClick="showHorization"/>
  <TextView
   android:layout_width="wrap_content"
   android:layout_height="60dp"
   android:gravity="center"
   android:background="#eeeeee"
   android:onClick="showVertical"
   android:layout_marginTop="10dp"
   android:text="切换底部垂直动画"/>
 </LinearLayout>
</RelativeLayout>

然后,我们再写一个线程来实现滚动的效果。代码如下:

public class AnimationUtil implements Runnable{
 private Context mContext;
 //传入需要操作的view
 private View mAnimationView;
 //view的宽和高
 private int mViewWidth;
 private int mViewHeight;
 //动画执行时间
 private final int DURATION = 400;
 //是水平还是垂直滑动变化
 public boolean mOrientaion ;
 //滚动操作类
 private Scroller mScroller;
 private boolean isShow;
 public AnimationUtil(Context context,final View mAnimationView){
  this.mContext = context ;
  this.mAnimationView = mAnimationView ;
  mScroller = new Scroller(context,new LinearInterpolator());
  //水平布局这里以屏幕宽为准
  mViewWidth = getScreenWidth();
  mViewHeight = mAnimationView.getMeasuredHeight();
  if(mViewHeight==0){
   mAnimationView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw() {
     mAnimationView.getViewTreeObserver().removeOnPreDrawListener(this);
     mViewHeight = mAnimationView.getMeasuredHeight();
     return true;
    }
   });
  }
 }

 public void setOrientaion(boolean isHorization){
  this.mOrientaion = isHorization;
 }
 //根据滑动变化,isScrollUp为true水平左边滑动,否则反之,
 //为false垂直往下隐藏,否则反之,
 public void startHideAnimation(boolean isScrollUp){
  isShow = false ;
  if(!mOrientaion){
   int dy = (int) (mAnimationView.getTranslationY()+mViewHeight);
   if(!isScrollUp){
    dy = (int)(mAnimationView.getTranslationY() - mViewHeight);
   }
   dy = cling(-mViewHeight,mViewHeight,dy);
   mScroller.startScroll(0, (int) mAnimationView.getTranslationY(),0,dy,DURATION);
   ViewCompat.postOnAnimation(mAnimationView,this);
   return;
  }
  int dx = (int) (mAnimationView.getTranslationX()-mViewWidth);
  if(!isScrollUp){
   dx = (int)(mAnimationView.getTranslationX() + mViewWidth);
  }
  dx = cling(-mViewWidth,mViewWidth,dx);
  mScroller.startScroll((int)mAnimationView.getTranslationX(),0,dx,0,DURATION);
  ViewCompat.postOnAnimation(mAnimationView,this);
 }
 //显示控件
 public void startShowAnimation(){
  isShow = true ;
  if(!mOrientaion){
   int dy = (int) ViewCompat.getTranslationY(mAnimationView);
   dy = cling(-mViewHeight,mViewHeight,dy);
   mScroller.startScroll(0,dy,0,-dy,DURATION);
   ViewCompat.postOnAnimation(mAnimationView,this);
   return;
  }
  int dx = (int) ViewCompat.getTranslationX(mAnimationView);
  dx = cling(-mViewWidth,mViewWidth,dx);
  mScroller.startScroll(dx,0,-dx,0,DURATION);
  ViewCompat.postOnAnimation(mAnimationView,this);
 }
 //判断当前绑定动画控件是否显示,
 public boolean isShow() {
  return isShow;
 }

 //终止动画
 public void abortAnimation(){
  mScroller.abortAnimation();
 }
 @Override
 public void run() {
  if(mScroller.computeScrollOffset()){
   //动画没停止就继续滑动
   ViewCompat.postOnAnimation(mAnimationView,this);
   if(!mOrientaion){
    ViewCompat.setTranslationY(mAnimationView,mScroller.getCurrY());
    return;
   }
   ViewCompat.setTranslationX(mAnimationView,mScroller.getCurrX());
  }
 }
 public int getScreenWidth(){
  WindowManager windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
  DisplayMetrics dm = new DisplayMetrics();
  windowManager.getDefaultDisplay().getMetrics(dm);
  return dm.widthPixels;
 }
 //控制在一个范围的值
 public int cling(int min,int max,int value){
  return Math.min(Math.max(min, value), max);
 }
}

这里简单说下上面AnimationUtil线程,首先它会创建一个滚动操作类Scroller,然后获取需要滚动的view的宽和高的获取,这里宽直接取屏幕的宽度。同时还有一个mOrientaion属性,方向的控制。然后startHideAnimation和startShowAnimation两个方法。其中startHideAnimation中,我们计算出每个效果的初始位置的x和y。然后x和y轴移动的偏移量,然后startScroll方法的调用,然后把通过ViewCompat.postOnAnimation把移动动画绑定在传入的view里面。startShowAnimation方法也是同理。我们知道,调用了startScroll,只是告诉Scroller移动到什么位置,具体的移动信息是在computeScrollOffset获取。所以我们通过这个方法就去判断view是否移动完成,没有移动,继续调用当前线程,同时根据方向设置setTranslationY或者setTranslationX。

view滚动的帮助类实现完了,我们就写个Recyclerview来简单的测试下,MainActivity代码如下:

public class MainActivity extends AppCompatActivity {
 //通过recyclerview来提供滑动事件
 private RecyclerView mRecyclerView;
 //一些简单的测试数据
 private TestAdapter mRecyclerAdapter;
 //水平简单赞布局view绑定动画
 private AnimationUtil mZanAnimationUtil;
 //水平简单评论布局view绑定动画
 private AnimationUtil mCommAnimationUtil;
 //垂直底部view绑定动画
 private AnimationUtil mBottomVerticalUtil;
 //垂直头顶view绑定布局
 private AnimationUtil mTopVerticalUtil;
 private List<String> mDataList=Arrays.asList("对Ta说了悄悄话","冲哥","小欢","对象,你在哪","暖心男神","一次就好",
   "对Ta说了悄悄话","冲哥","小欢","对象,你在哪","暖心男神","一次就好",
   "对Ta说了悄悄话","冲哥","小欢","对象,你在哪","暖心男神","一次就好",
   "对Ta说了悄悄话","冲哥","小欢","对象,你在哪","暖心男神","一次就好");
 private LinearLayoutManager mRecyclerManager;
 //赞布局控件
 private TextView mZanTextView;
 //评论布局控件
 private TextView mCommentView;
 private RelativeLayout mHorizationalRl;
 //底部布局控件
 private TextView mVerticalBottomTv;
 //头部布局控件
 private TextView mVerticalTopTv;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);
  mZanTextView = (TextView) findViewById(R.id.id_bottom_float);
  mCommentView = (TextView)findViewById(R.id.id_bottom_comment) ;
  mVerticalBottomTv = (TextView)findViewById(R.id.id_bottom_vertical);
  mHorizationalRl = (RelativeLayout)findViewById(R.id.id_horization_rl) ;
  mVerticalTopTv = (TextView)findViewById(R.id.id_top_vertical);
  mZanAnimationUtil = new AnimationUtil(this,mZanTextView);
  mCommAnimationUtil = new AnimationUtil(this,mCommentView);
  mBottomVerticalUtil = new AnimationUtil(this,mVerticalBottomTv);
  mTopVerticalUtil = new AnimationUtil(this,mVerticalTopTv);
  mZanAnimationUtil.setOrientaion(true);
  mCommAnimationUtil.setOrientaion(true);
  mCommAnimationUtil.startHideAnimation(false);
  mHorizationalRl.setVisibility(View.GONE);
  mRecyclerManager = new LinearLayoutManager(this);
  mRecyclerView.setLayoutManager(mRecyclerManager);
  mRecyclerAdapter = new TestAdapter(mDataList,this);
  mRecyclerView.setAdapter(mRecyclerAdapter);
  mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
   @Override
   public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    //当滑动停止时动画开始
    if(newState == RecyclerView.SCROLL_STATE_IDLE){
     //在到达某个item改变水平布局
     if(mRecyclerManager.findFirstVisibleItemPosition()>4){
      mZanAnimationUtil.startHideAnimation(true);
      mCommAnimationUtil.startShowAnimation();
     }else{
      mZanAnimationUtil.startShowAnimation();
      if(mCommAnimationUtil.isShow()){
       mCommAnimationUtil.startHideAnimation(false);
      }
     }
     //头部和底部动画操作
     if(mRecyclerManager.findFirstVisibleItemPosition()>0){
      mBottomVerticalUtil.startHideAnimation(true);
      mTopVerticalUtil.startHideAnimation(false);
     }else{
      mBottomVerticalUtil.startShowAnimation();
      mTopVerticalUtil.startShowAnimation();
     }
    }
   }

   @Override
   public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

   }
  });
 }
 public void showVertical(View view){
  mHorizationalRl.setVisibility(View.GONE);
  mVerticalBottomTv.setVisibility(View.VISIBLE);
 }
 public void showHorization(View view){
  mHorizationalRl.setVisibility(View.VISIBLE);
  mVerticalBottomTv.setVisibility(View.GONE);
 }
}

主要是onScrollStateChanged方法里面的操作。主要就是注意下评论布局控件的初始化就好了。

再贴下其他的类
TestAdapter.class

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.SimpleViewHolder>{
 private List<String> mDataList;
 private Context mContext;
 private LayoutInflater mInflater;

 public TestAdapter(List<String> mDataList, Context mContext) {
  this.mDataList = mDataList;
  this.mContext = mContext;
  mInflater = LayoutInflater.from(mContext);
 }

 @Override
 public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  return new SimpleViewHolder(mInflater.inflate(R.layout.simple_item,parent,false));
 }

 @Override
 public void onBindViewHolder(SimpleViewHolder holder, int position) {
  holder.mTextView.setText(mDataList.get(position));
 }

 @Override
 public int getItemCount() {
  return mDataList.size();
 }

 public class SimpleViewHolder extends RecyclerView.ViewHolder{
  private TextView mTextView;
  public SimpleViewHolder(View itemView) {
   super(itemView);
   this.mTextView = (TextView)itemView.findViewById(R.id.id_text);
  }
 }
}

simple_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@android:color/white">
 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="100dp"
  android:orientation="horizontal"
  android:gravity="center_vertical">
  <ImageView
   android:layout_width="60dp"
   android:layout_height="60dp"
   android:background="#EEEEEE"
   android:layout_margin="10dp"
   android:src="@drawable/post_default_avatar"/>
  <TextView
   android:id="@+id/id_text"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="21111111"
   android:textSize="14sp"
   android:layout_marginLeft="10dp"/>
 </LinearLayout>
 <View
  android:layout_width="match_parent"
  android:layout_height="0.5dp"
  android:layout_marginTop="10dp"
  android:background="#eeeeee"/>
</LinearLayout>

最后,看下实现的效果:

这里 开发环境为android studio 2.1.0 -preview4

源码下载:Recyclerview滑动左右移动

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

(0)

相关推荐

  • android RecyclerView侧滑菜单,滑动删除,长按拖拽,下拉刷新上拉加载

    本文介绍的库中的侧滑效果借鉴自SwipeMenu,并对SipwMenu的源码做了修改与Bug修复,然后才开发出的SwipeRecyclerView. 需要说明的是,本库没有对RecyclerView做大的修改,只是ItemView的封装.看起来是对RecyclerView的修改,其实仅仅是为RecyclerView添加了使用的方法API而已. 本库已经更新了三个版本了,会一直维护下去,根据小伙伴的要求,以后也会添加一些其它功能. SwipeRecyclerView将完美解决这些问题: 以下功能全

  • Android利用RecyclerView实现全选、置顶和拖拽功能示例

    前言 今天给大家分享是如何在RecyclerView实现全选,ItemTouchHelper实现侧滑删除,拖拽功能.比较基础.关于RecyclerView的强大,就不多说了.在Android L SDK发布的新API中最有意思的就是RecyclerView 和 CardView了, 按照官方的说法, RecyclerView 一个ListView 的一个更高级更灵活的一个版本, 可以自定义的东西太多了. 效果: RecyclerView实现全选,ItemTouchHelper实现侧滑删除,拖拽功

  • RecyclerView进阶:使用ItemTouchHelper实现拖拽和侧滑删除效果

    前言 现在RecyclerView的应用越来越广泛了,不同的应用场景需要其作出不同的改变.有时候我们可能需要实现侧滑删除的功能,比如知乎首页的侧滑删除,又或者长按Item进行拖动与其他Item进行位置的交换,但RecyclerView没有提供现成的API供我们操作,所幸SDK提供了ItemTouchHelper这样一个工具类帮助我们快速实现以上功能.不多说别的,我们来介绍一下ItemTouchHelper. 什么是ItemTouchHelper This is a utility class t

  • android的RecyclerView实现拖拽排序和侧滑删除示例

    在平时开发应用的时候,经常会遇到列表排序.滑动删除的需求.如果列表效果采用的是 ListView 的话,需要经过自定义 View 才能实现效果:但是如果采用的是 RecyclerView 的话,系统 API 就已经为我们提供了相应的功能. 接下来,我们就来看一下怎么用系统 API 来实现排序和删除的效果. 创建 ItemTouchHelper 创建一个 ItemTouchHelper 对象,然后其调用 attachToRecyclerView 方法: RecyclerView recyclerV

  • Android recyclerview实现拖拽排序和侧滑删除

    Recyclerview现在基本已经替代Listview了,RecyclerView也越来越好用了  当我们有实现条目的拖拽排序和侧滑删除时  可以直接时候Recyclerview提供的API就可以直接实现了 先贴上主要代码 private void initveiw() { ArrayList<String> items = new ArrayList<>(Arrays.asList("itme1", "item2", "itme

  • Android应用开发中RecyclerView组件使用入门教程

    RecyclerView是一种列表容器, 发布很久了, 才想起来写点什么. RecyclerView相比于ListView, 在回收重用时更具有灵活性, 也就是低耦合, 并且提供了扩展. 加载多个视图时, 应该多用RecyclerView代替ListView. 那么我们来看看这东西应该怎么用? 比如生成一个瀑布流的视图. 首先我们从一个HelloWorld写起, 看看如何构建一个RecyclerView. 1. 依赖库 Gradle配置, 添加Recycler库 compile 'com.and

  • Android中RecyclerView实现横向滑动代码

    RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好.本文给大家介绍Android中RecyclerView实现横向滑动代码,一起看看吧. android.support.v7.widget.RecyclerView 功能:RecyclerView横向滑动 控件:<android.support.v7.widget.RecyclerView /> Java类:RecyclerView.GalleryAdap

  • Android实现评论栏随Recyclerview滑动左右移动

    最近在玩一个叫"约会吧"的应用,也是在看直播app,默认下载安装的,安装点进去看这个应用做的不错,就留下来了.然后看他们动态详情页底部有一个效果:Recyclerview滑动到的评论列表的时候,底部点赞那栏会往左滑动,出现一个输入评论的栏:然后下拉到底部的时候输入评论栏会往右滑动,出现点赞栏.详细细节直接来看效果图吧. 其实这种效果现在在应用中还是很常见的,有上拉,toolbar.底部view隐藏,下拉显示,或者像现在约会吧这样左右滑动的效果.而且网上资料现在也有很多,有通过Objec

  • Android模仿实现微博详情页滑动固定顶部栏的效果实例

    前言 最近项目中遇到一个需求,类似微博详情页的效果,通过查找相关的资料终于找了对应的解决方案,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 先来看下我们今天要实现的效果: 滑动固定顶部栏效果图 这段时间公司准备重构一个项目,刚好用到这个效果,我就顺带写了篇文章,关于这个效果网上可以找到一些相关资料的,昨晚看了一些,感觉都不是很好,有点模棱两可的样子,也没提到需要注意的一些关键点,这里来做下整理,由于涉及到公司的代码,这里我就写个简单的Demo来讲解. 简单Demo 传统套路:

  • Android获取RecyclerView滑动距离方法详细讲解

    先说能用的究极解决方案,大家着急的直接复制走,以后想了解再过来看 没有header,且所有Item的高度一致 private fun getScrollYDistance(recyclerView: RecyclerView): Int? { kotlin.runCatching { val layoutManager = recyclerView.layoutManager as LinearLayoutManager val position = layoutManager.findFirs

  • Android中RecyclerView 滑动时图片加载的优化

    RecyclerView 滑动时的优化处理,在滑动时停止加载图片,在滑动停止时开始加载图片,这里用了Glide.pause 和Glide.resume.这里为了避免重复设置增加开销,设置了一个标志变量来做判断. mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, in

  • RecyclerView嵌套RecyclerView滑动卡顿的解决方法

    Android 利用RecyclerView仿淘宝订单页面实现,解决RecyclerView嵌套RecyclerView滑动卡顿 问题: 最近在项目中碰到一个问题,类似于淘宝订单页面,由于每个订单项中可能会包含多个具体的项目,要想实现这种效果,一般来说需要在RecyclerView中嵌套RecyclerView,这样做会导致,如果订单项中的具体项目过多,超过一屏,展示效果会有卡顿现象,原因就是由于两个RecyclerView的存在,使得滑动的view滑出当前屏幕的释放存在冲突 思路: 参照 An

  • 超简单的几行代码搞定Android底部导航栏功能

    超简单,几行代码搞定Android底部导航栏-–应项目需求以及小伙伴的留言,新加了两个方法: 设置底部导航栏背景图片 添加底部导航栏选项卡切换监听事件 底部导航栏的实现也不难,就是下边是几个Tab切换,上边一般是一个FrameLayout,然后FrameLayout中切换fragment. 网上有不少关于Android底部导航栏的文章,不过好像都只是关于下边Tab切的,没有实现Tab与fragment的联动,用的时候还要自己手写这部分代码,对我这个比较懒(据说,懒是程序员的一种美德_#)得程序员

  • Android底部导航栏的动态替换方案

    Android底部导航栏的动态替换方案,供大家参考,具体内容如下 1.通常来说,一般情况下,我们的app的BottomTab会有下面几种实现方式. 1).自定义view,然后自己写逻辑去实现互斥. 2).使用RadioGroup+RadioButton去实现底部的Tab. 自由度比极高,如果想实现搞复杂度的话可以重写 RadioButton. 3).使用google design包里面的 TabLayout去实现. 可上.可下.可以滑动 偷懒的话可以根据已有api来设置一些资源,也可以 setC

  • Android底部导航栏的三种风格实现

    一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Google 给我们提供的一个专门用于底部导航的 View,你只需要在新建 Activity 的时候选择 "Bottom Navigation Activity",IDE 就会自动使用 BottomNavigationView 帮你生成好相应的代码了. 1. 在 xml 中使用 <andr

  • Android如何使用ViewPager2实现页面滑动切换效果

    目录 1.引言 2.实现页面滑动切换 2.1 引入ViewPager2库 2.2 使用ViewPager2 2.3 构建Fragment 2.4 继承FragmentStateAdapter 2.5 将ViewPager2与适配器绑定 2.6 垂直方向滑动切换 2.7 Fragment更新 3.总结 1.引言 在很多应用中,我们经常会看到多个页面之间滑动切换的场景,ViewPager2是ViewPager的升级版,本文将简要介绍如何使用ViewPager2.FragmentStateAdapte

  • Android编程实现Gallery中每次滑动只显示一页的方法

    本文实例讲述了Android编程实现Gallery中每次滑动只显示一页的方法.分享给大家供大家参考,具体如下: import android.content.Context; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; import android.widget.Gallery; public class DetialGallery extends

随机推荐