1.給ListView增加一個HeaderView,避免第一個Item被Toolbar遮擋
Tips:
getResources().getDimension(R.dimen.abc_action_bar_default_height_material)
獲取系統ActionBar高度(即Toolbar高度)
2.獲取最低滑動距離
touchSlop = ViewConfiguration.get(this).getScaledTouchSlop();
3.判斷滑動事件+重寫監聽
ObjectAnimator類.ofFloat->構建並返回一個objectanimator動畫之間的浮點值
第一個參數:動畫的對象/第二個參數:動畫名稱/第三個參數:初始值->結束值
4.建立彈性ListView
ListView源碼中的控制滑動到邊緣的處理方法
overScrollBy中的maxOverScrollX/Y參數
因爲不同的density,需要在構造函數中初始化並獲取此對象
overScrollView
import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.View; import android.widget.ListView; import java.util.List; /** * Created by YRC on 2017/10/15. */ public class OverScrollView extends ListView{ private static int mMaxOverScrollY=200; private Context mContext; public OverScrollView(Context context) { super(context); mContext=context; initView(); } public OverScrollView(Context context, AttributeSet attrs) { super(context, attrs); mContext=context; initView(); } public OverScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mContext=context; initView(); } private void initView() { DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); float density = metrics.density; mMaxOverScrollY = (int) (density * mMaxOverScrollY); } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxOverScrollY, isTouchEvent); } }
MainAc:
public class MainActivity extends AppCompatActivity { private int touchSlop; Toolbar mToolbar; private String[] mStr = new String[20]; ListView listView; private int mFirstY, mCurrentY, dis; private boolean mShow = true; private Animator animator; private ListView mListView; List<ChatItemBean> data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); touchSlop = ViewConfiguration.get(this).getScaledTouchSlop(); mToolbar = (Toolbar) findViewById(R.id.toolbar); listView = (ListView) findViewById(R.id.listview); for (int i = 0; i < mStr.length; i++) { mStr[i] = "item" + i; } View header = new View(this); header.setLayoutParams(new AbsListView.LayoutParams( AbsListView.LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.abc_action_bar_default_height_material))); listView.addHeaderView(header); ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_expandable_list_item_1, mStr); listView.setAdapter(adapter); listView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mFirstY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: mCurrentY = (int) event.getY(); if (mFirstY - mCurrentY > touchSlop) { dis = 0; //向下滑 } else if (mCurrentY - mFirstY > touchSlop) { dis = 1; //向上滑 } if (dis == 0) { if (mShow) { toolbarAnim(0); mShow = !mShow; } } else { if (!mShow) { toolbarAnim(1); mShow = !mShow; } } } return false; } }); } private void toolbarAnim(int flag) { if (animator != null && animator.isRunning()) { animator.cancel(); } if (flag == 0) { animator = ObjectAnimator.ofFloat(mToolbar, "translationY", mToolbar.getTranslationY(), -mToolbar.getHeight()); } else if (flag == 1) { animator = ObjectAnimator.ofFloat(mToolbar, "translationY", mToolbar.getTranslationY(), 0); } animator.start(); } }