Android App开发中使用RecyclerView实现Gallery画廊的实例

2019-12-10 18:27:32于海丽

和我之前那个例子的效果是一模一样的,不过,我还想做一些改变,我觉得Gallery或者说相册的指示器,下面可能1000来张图片,我不仅喜欢手指在屏幕上滑动时,图片会自动切换。我还希望,如果我给指示器一个加速度,即使手指离开,下面还在滑动,上面也会联动 。而且我还想做些优化,直接在ACTION_MOVE中回调,触发的频率太高了,理论上一张图片只会触发一次~~
4、优化与打造真正的Gallery效果
既然希望手指离开还能联动,那么不仅需要ACTION_MOVE需要监听,还得监听一个加速度,速度到达一定值,然后继续移动~~再理一理,需要这么麻烦么,不是能滚动么,那么应该有OnScrollListener啊,小看一把,果然有,哈哈哈~天助我也,下面看修改后的代码:

package com.example.zhy_horizontalscrollview03; 
 
import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.RecyclerView.OnScrollListener; 
import android.util.AttributeSet; 
import android.view.View; 
 
public class MyRecyclerView extends RecyclerView implements OnScrollListener 
{ 
 
  /** 
   * 记录当前第一个View 
   */ 
  private View mCurrentView; 
 
  private OnItemScrollChangeListener mItemScrollChangeListener; 
 
  public void setOnItemScrollChangeListener( 
      OnItemScrollChangeListener mItemScrollChangeListener) 
  { 
    this.mItemScrollChangeListener = mItemScrollChangeListener; 
  } 
 
  public interface OnItemScrollChangeListener 
  { 
    void onChange(View view, int position); 
  } 
 
  public MyRecyclerView(Context context, AttributeSet attrs) 
  { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
    this.setOnScrollListener(this); 
  } 
 
  @Override 
  protected void onLayout(boolean changed, int l, int t, int r, int b) 
  { 
    super.onLayout(changed, l, t, r, b); 
 
    mCurrentView = getChildAt(0); 
 
    if (mItemScrollChangeListener != null) 
    { 
      mItemScrollChangeListener.onChange(mCurrentView, 
          getChildPosition(mCurrentView)); 
    } 
  } 
 
 
  @Override 
  public void onScrollStateChanged(int arg0) 
  { 
  } 
 
  /** 
   * 
   * 滚动时,判断当前第一个View是否发生变化,发生才回调 
   */ 
  @Override 
  public void onScrolled(int arg0, int arg1) 
  { 
    View newView = getChildAt(0); 
 
    if (mItemScrollChangeListener != null) 
    { 
      if (newView != null && newView != mCurrentView) 
      { 
        mCurrentView = newView ; 
        mItemScrollChangeListener.onChange(mCurrentView, 
            getChildPosition(mCurrentView)); 
 
      } 
    } 
 
  } 
 
}