自定义view实战笔记--快速索引

一:在Java中,自定义类想要比较需要实现Comparable接口,并重写compareTo方法

二:可以使用工具类Collections.sort(haoHanArrayList);对自定义集合进行排序

三:除以2,可以使用乘以0.5f,这样不容易丢失精度

四:要让字母显示在父控件的中间,可以如下:

//1 绘制 A-Z 26个字母
        for (int i = 0; i < LETTERS.length; i++) {
            mPaint.setColor(i == lastTouchIndex ? Color.GREEN : Color.WHITE);
            //获取到字母的边界矩形
            Rect rect = new Rect();
            mPaint.getTextBounds(LETTERS[i], 0, LETTERS[i].length(), rect);
            //把字母画在单元格的中间
            float x = ceilWidth * 0.5f - rect.width() * 0.5f;
            float y = ceilHeight * 0.5f + rect.height() * 0.5f + i * ceilHeight;

            canvas.drawText(LETTERS[i], x, y, mPaint);
        }

五:判断触摸到哪个字母,并且提高效率

 //判断触摸到了哪个字母
                float downY = event.getY();
                currentTouchIndex = (int) (downY / ceilHeight);
                if (currentTouchIndex != lastTouchIndex) {
                    if (currentTouchIndex >= 0 && currentTouchIndex < LETTERS.length) {
                        lastTouchIndex = currentTouchIndex;
                        Utils.showToast(getContext(), LETTERS[lastTouchIndex]);
                        if (mOnLetterChangeListener != null) {
                            mOnLetterChangeListener.onLetterChange(LETTERS[lastTouchIndex]);
                        }
                    }
                }

六:理解监听回调的步骤,一般自定义view肯定会用到

    public void setOnLetterChangeListener(OnLetterChangeListener  mOnLetterChangeListener) {
        this.mOnLetterChangeListener = mOnLetterChangeListener;
    }

    private OnLetterChangeListener mOnLetterChangeListener;


    interface OnLetterChangeListener {
        void onLetterChange(String letter);
    }

七:一般可以在onSizeChanged()方法中去拿到控件的宽高,并做处理

 @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        //每一个字母单元格的高度
        ceilHeight = h * 1.0f / LETTERS.length;
        //每一个字母单元格的宽度
        ceilWidth = w;
    }

八:在触摸的时候让listView跟随滚动,可以先获取到listview滚动到的位置,然后listView.setSelection(position);

qiv.setOnLetterChangeListener(new QuickIndexerView.OnLetterChangeListener() {
    @Override
    public void onLetterChange(String letter) {
        //找到listview需要滚动到的位置
        for (int i = 0; i < haoHanArrayList.size(); i++) {
            if (letter.equals(haoHanArrayList.get(i).getFirstLetter())) {
                listView.setSelection(i);
                tv_header.setText(haoHanArrayList.get(i).getFirstLetter());
                break;
            }
        }
    }
});

九:listview的悬浮标题通常可以用表头布局覆盖在listview顶部,然后在OnScrollListener中去修改值

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        tv_header.setText(haoHanArrayList.get(firstVisibleItem).getFirstLetter());

    }
});

十:在listview的Adapter的getview方法中,如果有需要比较上下两个条目,可以把第一条分开来

if(position == 0) {

}else{

}

这样不容易数组越界

十一:移除handler之前的延时操作:mHandler.removeCallbacksAndMessages(null);

MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值