周末小結(一)

《最后一顆子彈送給我》讀后感

夜晚偶然打開同學群 發現有不少結婚了 甚至有的孩子都幾歲了。上周的90后最后一波高考已經過去 偶爾在地鐵上看到幾張稚嫩的面孔 忽然感覺青春的濃霧散去好久了 裸露出生活的荒原 大家忙碌著。加入各種同學群 大學群 高中群 甚至小學群 。群公告無一例外寫著 "友誼長存"之類的祝福語 大家少有奮不顧身的制造出一種熱鬧 ,守住這些熱鬧 但 也僅僅是這些熱鬧而已。你喜歡的 你不喜歡的幾年前就已經做出了選擇。 大家無一例外的被生活的子彈打中。我們所有的驕傲無非是我們親手把人與一切社會的總和揉成的紙團丟進垃圾桶而已。 如果有一天 我也被生活的一顆子彈打中一只眼睛 我希望你能送我一顆子彈 讓我從此失明。 前幾年剛工作的時候寫不某種東西 感到羞恥 拼了命的找代碼實現。 現在也很多寫不出來 找人溝通。溝通的結果是還得寫 但是卻不在感到羞恥。

上周和朋友吃飯

上周和朋友吃飯 街對面有一對情侶吵架。男的說:"你不是叫我滾嗎?我滾。”然后開始掃碼一個OFO小黃車。女的說:“你真的不會后悔嗎?”男的說:“我們這樣遲早也是要分手的。”一陣沉默,男的繼續掃碼小黃車。過了一會女的已經走了,男的還在掃碼小黃車。朋友:“膜拜廣告 還可以這樣?” 我說:“大概手機沒開4g網絡吧。” 我說:“要是那個女的走到拐角處 給朋友打電話 朋友開大奔來接她 可能又是一個精彩的故事。”

見字如面

上周在地鐵上 聽網易一個電臺《見字如面》 魯迅寫給許廣平 魯迅全集 我在高中的時候就已經全部看完了 到現在一點印象都沒有了。 但是魯迅的文字 還是真摯感人的 這里截取一段:

我其實哪里會“立地成佛”,許多煙卷,不過麻醉藥,煙霧中也沒有見過極樂世界。假使我真有指導青年的本領,無論指導得錯不錯,我覺不會藏匿起來。但可惜我連自己也沒有指南針,但現在還是亂問。倘若闖入深坑,自己對自己負責,領著別人有怎么好呢。

最后

以上是一些碎碎念,上周簡單實現了一個listview左滑 右滑刪除功能 這里簡單粘一下代碼。原文鏈接懶得找了 不過感謝原作者。
<code>

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);
  }

}

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

最后妹子圖~= 好心情



我的臉太大了么?
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容