周末小结(一)

《最后一颗子弹送给我》读后感

夜晚偶然打开同学群 发现有不少结婚了 甚至有的孩子都几岁了。上周的90后最后一波高考已经过去 偶尔在地铁上看到几张稚嫩的面孔 忽然感觉青春的浓雾散去好久了 裸露出生活的荒原 大家忙碌着。加入各种同学群 大学群 高中群 甚至小学群 。群公告无一例外写着 "友谊长存"之类的祝福语 大家少有奋不顾身的制造出一种热闹 ,守住这些热闹 但 也仅仅是这些热闹而已。你喜欢的 你不喜欢的几年前就已经做出了选择。 大家无一例外的被生活的子弹打中。我们所有的骄傲无非是我们亲手把人与一切社会的总和揉成的纸团丢进垃圾桶而已。 如果有一天 我也被生活的一颗子弹打中一只眼睛 我希望你能送我一颗子弹 让我从此失明。 前几年刚工作的时候写不某种东西 感到羞耻 拼了命的找代码实现。 现在也很多写不出来 找人沟通。沟通的结果是还得写 但是却不在感到羞耻。

上周和朋友吃饭

上周和朋友吃饭 街对面有一对情侣吵架。男的说:"你不是叫我滚吗?我滚。”然后开始扫码一个OFO小黄车。女的说:“你真的不会后悔吗?”男的说:“我们这样迟早也是要分手的。”一阵沉默,男的继续扫码小黄车。过了一会女的已经走了,男的还在扫码小黄车。朋友:“膜拜广告 还可以这样?” 我说:“大概手机没开4g网络吧。” 我说:“要是那个女的走到拐角处 给朋友打电话 朋友开大奔来接她 可能又是一个精彩的故事。”

见字如面

上周在地铁上 听网易一个电台《见字如面》 鲁迅写给许广平 鲁迅全集 我在高中的时候就已经全部看完了 到现在一点印象都没有了。 但是鲁迅的文字 还是真挚感人的 这里截取一段:

我其实哪里会“立地成佛”,许多烟卷,不过麻醉药,烟雾中也没有见过极乐世界。假使我真有指导青年的本领,无论指导得错不错,我觉不会藏匿起来。但可惜我连自己也没有指南针,但现在还是乱问。倘若闯入深坑,自己对自己负责,领着别人有怎么好呢。

最后

以上是一些碎碎念,上周简单实现了一个listview左滑 右滑删除功能 这里简单粘一下代码。原文链接懒得找了 不过感谢原作者。

public class SlideleteListView extends ListView {
  /**
   * 当前滑动的ListView position
   */
  private int slidePosition;
  /**
   * 手指按下X的坐标
   */
  private int downY;
  /**
   * 手指按下Y的坐标
   */
  private int downX;
  /**
   * 屏幕宽度
   */
  private int screenWidth;
  /**
   * ListView的item
   */
  private View itemView;
  /**
   * 滑动类
   */
  private Scroller scroller;
  private static final int SNAP_VELOCITY = 600;
  /**
   * 速度追踪对象
   */
  private VelocityTracker velocityTracker;
  /**
   * 是否响应滑动,默认为不响应
   */
  private boolean isSlide = false;
  /**
   * 认为是用户滑动的最小距离
   */
  private int mTouchSlop;
  /**
   *  移除item后的回调接口
   */
  private RemoveListener mRemoveListener;
  /**
   * 用来指示item滑出屏幕的方向,向左或者向右,用一个枚举值来标记
   */
  private RemoveDirection removeDirection;

  // 滑动删除方向的枚举值
  public enum RemoveDirection {
    RIGHT, LEFT;
  }


  public SlideleteListView(Context context) {
    this(context, null);
  }

  public SlideleteListView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public SlideleteListView(Context context, AttributeSet attrs, int  defStyle) {
    super(context, attrs, defStyle);
    screenWidth = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
    scroller = new Scroller(context);
    mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
  }

  /**
   * 设置滑动删除的回调接口
   * @param removeListener
   */
  public void setRemoveListener(RemoveListener removeListener) {
    this.mRemoveListener = removeListener;
  }

  /**
   * 分发事件,主要做的是判断点击的是那个item, 以及通过  postDelayed来设置响应左右滑动事件
   */
  @Override
  public boolean dispatchTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN: {
        addVelocityTracker(event);

        // 假如scroller滚动还没有结束,我们直接返回
        if (!scroller.isFinished()) {
          return super.dispatchTouchEvent(event);
        }
        downX = (int) event.getX();
        downY = (int) event.getY();

        slidePosition = pointToPosition(downX, downY);

        // 无效的position, 不做任何处理
        if (slidePosition == AdapterView.INVALID_POSITION) {
          return super.dispatchTouchEvent(event);
        }

        // 获取我们点击的item view
        itemView = getChildAt(slidePosition - getFirstVisiblePosition());
        break;
      }
      case MotionEvent.ACTION_MOVE: {
        if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY
            || (Math.abs(event.getX() - downX) > mTouchSlop && Math
            .abs(event.getY() - downY) < mTouchSlop)) {
          isSlide = true;
        }
        break;
      }
      case MotionEvent.ACTION_UP:
        recycleVelocityTracker();
        break;
    }

    return super.dispatchTouchEvent(event);
  }

  /**
   * 往右滑动,getScrollX()返回的是左边缘的距离,就是以View左边缘为原点到开始滑动的距离,所以向右边滑动为负值
   */
  private void scrollRight() {
    removeDirection = RemoveDirection.RIGHT;
    final int delta = (screenWidth + itemView.getScrollX());
    // 调用startScroll方法来设置一些滚动的参数,我们在 computeScroll()方法中调用scrollTo来滚动item
    scroller.startScroll(itemView.getScrollX(), 0, -delta, 0,
        Math.abs(delta));
    postInvalidate(); // 刷新itemView
  }

  /**
   * 向左滑动,根据上面我们知道向左滑动为正值
   */
  private void scrollLeft() {
    removeDirection = RemoveDirection.LEFT;
    final int delta = (screenWidth - itemView.getScrollX());
    // 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动item
    scroller.startScroll(itemView.getScrollX(), 0, delta, 0,
        Math.abs(delta));
  postInvalidate(); // 刷新itemView
}

  /**
   * 根据手指滚动itemView的距离来判断是滚动到开始位置还是向左或者向右滚动
   */
  private void scrollByDistanceX() {
    // 如果向左滚动的距离大于屏幕的三分之一,就让其删除
    if (itemView.getScrollX() >= screenWidth / 3) {
        scrollLeft();
    } else if (itemView.getScrollX() <= -screenWidth / 3) {
      scrollRight();
    } else {
      // 滚回到原始位置,为了偷下懒这里是直接调用scrollTo滚动
      itemView.scrollTo(0, 0);
    }

  }

  /**
   * 处理我们拖动ListView item的逻辑
   */
  @Override
  public boolean onTouchEvent(MotionEvent ev) {
    if (isSlide && slidePosition != AdapterView.INVALID_POSITION) {
      addVelocityTracker(ev);
      final int action = ev.getAction();
      int x = (int) ev.getX();
      switch (action) {
        case MotionEvent.ACTION_MOVE:
          int deltaX = downX - x;
          downX = x;

          // 手指拖动itemView滚动, deltaX大于0向左滚动,小于0向右滚
          itemView.scrollBy(deltaX, 0);
          break;
        case MotionEvent.ACTION_UP:
          int velocityX = getScrollVelocity();
          if (velocityX > SNAP_VELOCITY) {
            scrollRight();
          } else if (velocityX < -SNAP_VELOCITY) {
            scrollLeft();
          } else {
            scrollByDistanceX();
          }

          recycleVelocityTracker();
          // 手指离开的时候就不响应左右滚动
          isSlide = false;
          break;
      }

      return true; // 拖动的时候ListView不滚动
    }

    //否则直接交给ListView来处理onTouchEvent事件
    return super.onTouchEvent(ev);
  }

  @Override
  public void computeScroll() {
    // 调用startScroll的时候scroller.computeScrollOffset()返回true,
    if (scroller.computeScrollOffset()) {
      // 让ListView item根据当前的滚动偏移量进行滚动
      itemView.scrollTo(scroller.getCurrX(), scroller.getCurrY());

      postInvalidate();

      // 滚动动画结束的时候调用回调接口
      if (scroller.isFinished()) {
        if (mRemoveListener == null) {
          throw new NullPointerException("RemoveListener is null, we should called setRemoveListener()");
        }

        itemView.scrollTo(0, 0);
        mRemoveListener.removeItem(removeDirection, slidePosition);
      }
    }
  }


  private void addVelocityTracker(MotionEvent event) {
    if (velocityTracker == null) {
      velocityTracker = VelocityTracker.obtain();
    }

    velocityTracker.addMovement(event);
  }


  private void recycleVelocityTracker() {
    if (velocityTracker != null) {
      velocityTracker.recycle();
      velocityTracker = null;
    }
  }


  private int getScrollVelocity() {
    velocityTracker.computeCurrentVelocity(1000);
    int velocity = (int) velocityTracker.getXVelocity();
    return velocity;
  }


  public interface RemoveListener {
    public void removeItem(RemoveDirection direction, int position);
  }

}


使用:

@Override
public void removeItem(SlideleteListView.RemoveDirection direction, final int position) {
switch (direction) {
case RIGHT://右滑
case LEFT://左滑
break;
default:
break;
}
}

最后妹子图~= 好心情


周末小结(一)_第1张图片

周末小结(一)_第2张图片
我的脸太大了么?

你可能感兴趣的:(周末小结(一))