android TV 开发 焦点自动滚动到屏幕中间位置

/**
 * 焦点自动滚动到屏幕中间位置
 */
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();
   });

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值