/** * 焦点自动滚动到屏幕中间位置 */ private void autoScrollListener(View view) { DisplayMetrics outMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getRealMetrics(outMetrics); int widthPixel = outMetrics.widthPixels; heightPixel = outMetrics.heightPixels; view.getViewTreeObserver() .addOnGlobalFocusChangeListener((oldFocus, newFocus) -> { if (newFocus != null) { int[] ints = new int[2]; newFocus.getLocationInWindow(ints); int viewCenter = Math.round((newFocus.getHeight() >> 1) + ints[1]);//当前获取焦点的view中心 int screenCenter = Math.round(heightPixel >> 1);//屏幕中心 int i = viewCenter - screenCenter;//当前焦点view到中心的距离 if (i < 0) { pageScroll(i); } else { pageScroll(i); } int[] mllInts = new int[2]; view.getLocationInWindow(mllInts); } }); }
/** * 手动滚动页面 */ private void pageScroll(int offset) { if (Math.abs(offset) < 200) { //距离小于200不动 return; } mHandler.post(() -> { if (pageDownObjectAnimator != null && pageDownObjectAnimator.isRunning()) { pageDownObjectAnimator.cancel(); } int[] ints = new int[2]; findViewById(R.id.ll_scroll).getLocationOnScreen(ints); int end = ints[1] - offset; if (end < -3000) { end = -3000;//极限距离 } else if (end > 0) { end = 0; } pageDownObjectAnimator = ObjectAnimator .ofFloat(findViewById(R.id.ll_scroll), "translationY", ints[1], end); pageDownObjectAnimator.setDuration(250); pageDownObjectAnimator.start(); }); }