Android TV 自定义Listview平滑滑动

文章介绍了如何在TV应用中优化Listview的焦点处理,使其在使用遥控器操作时,焦点始终位于中间并带有平滑滚动的动画效果。主要涉及onDraw方法重绘焦点位置,onKeyDown事件处理焦点移动及平滑滚动的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

        由于在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);
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值