Android TV 自定义Listview平滑滑动

前言

        由于在TV上面的操作不是通过手指来滑动,需要用遥控器来操作,所以Listview中item的焦点处理就显得很重要,但自带的listview会有一个缺点导致操作体验不是很好,那就是item的焦点会随着上下按键显示在最上方和最下方,而且也没有动画效果。本篇文章介绍一种焦点在中间位置,listview上下滑动的实现方法,这种效果在TV上体验比较好,效果图如下:

步骤

1.重绘焦点的位置

protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (this.isFocused()) {// 绘制焦点框的位置
            Log.i(TAG, "onDraw = =======");
            Rect rect = new Rect();
            rect.set(0, itemHeight * itemFocusInCenter
                    + getItemFocusCurrentPos(), itemWidth, itemHeight
                    * (itemFocusInCenter + 1) + getItemFocusCurrentPos());
            mSelector.setBounds(rect);
            mSelector.draw(canvas);
        }
    }

         根据每次移动的距离去重新绘制焦点框的位置,当焦点框处于中间位置的时候就去移动listview,这时候用到的就是smoothScrollBy(int distance, int duration),其中distance参数表示移动的距离,duration表示移动的时间。

2.在onKeyDown按键事件里去判断并计算移动的距离

public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        View view = getSelectedView();
        Log.i(TAG, "onKeyDown ###############################");
        int currentPositon = getSelectedItemPosition();
        if (view == null)
            return false;
        switch (keyCode) {
        case KeyEvent.KEYCODE_DPAD_DOWN:
            if(itemFocusInCenter <= currentPositon){
                smoothScrollBy(itemHeight, scrollDuration);
            }
            handler.removeMessages(SHOW_CURRENT_FOCUS);
            handler.sendEmptyMessageDelayed(SHOW_CURRENT_FOCUS, 200);
            break;
        case KeyEvent.KEYCODE_DPAD_UP:
            if(currentPositon < itemsCount - itemFocusInCenter){
                smoothScrollBy(-itemHeight, scrollDuration);
            }
            handler.removeMessages(SHOW_CURRENT_FOCUS);
            handler.sendEmptyMessageDelayed(SHOW_CURRENT_FOCUS, 200);
            break;
        }
        return super.onKeyDown(keyCode, event);
    }

        以上就是实现该效果的重要代码,最重要的就是焦点位置的判断以及焦点的重绘和每次移动距离的计算,理解了这几点之后,实现起来就容易多了。 

猜你喜欢

转载自blog.csdn.net/cike123_/article/details/129123488