android UI 优化之 AbsListView之深度优化

android 数字选择器中文字颜色透明度渐变的实现 首先看android View源码中渐变的实现 draw方法 boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0; boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0; 这个需要调用setVerticalFadingE 阅读详情
android提供的很多List控件如 listview、gridview默认都会显示一个fadingedge的东西,它在View的top和bottom处各显示一个渐变半透的阴影以达到更好的视觉效果,但是这个带来的副作用就是导致在性能不是那么强劲的机器上,一些listview,gridview的拖动会显得很不流畅,因为我们知道绘制带Alpha的图片是最耗时的。 
 
我们的优化思路就是对这个fadingedge做一些修改,当view处于滚动状态时,通过接口setVerticalFadingEdgeEnabled(false)让其不显示fadingedge,当view处于静止状态时,通过接口setVerticalFadingEdgeEnabled(true)恢复显示fadingedge。以上的listview和gridview等控件都是继承与AbsListView,所以我们直接修改framework中的AbsListView.java文件,就可以达到系统级的改动效果了。 
 
具体修改如下: 
    @Override 
    publicboolean onTouchEvent(MotionEvent ev) { 
        if(!isEnabled()) { 
            //A disabled view that is clickable still consumes thetouch 
            //events, it just doesn't respond to them. 
            returnisClickable() || isLongClickable(); 
        } 
        if(mFastScroller != null) { 
            booleanintercepted =mFastScroller.onTouchEvent(ev); 
            if(intercepted) { 
                returntrue; 
            } 
        } 
        finalint action = ev.getAction(); 
        Viewv; 
        intdeltaY; 
        if(mVelocityTracker == null) { 
            mVelocityTracker= VelocityTracker.obtain(); 
        } 
        mVelocityTracker.addMovement(ev); 
        switch(action & MotionEvent.ACTION_MASK){ 
        caseMotionEvent.ACTION_DOWN: { 
            setVerticalFadingEdgeEnabled(false); 
            mActivePointerId= ev.getPointerId(0); 
            finalint x = (int) ev.getX(); 
            finalint y = (int) ev.getY(); 
            intmotionPosition = pointToPosition(x, y); 
            if(!mDataChanged) { 
                if((mTouchMode != TOUCH_MODE_FLING)&& (motionPosition>= 0) 
                        &&(getAdapter().isEnabled(motionPosition))) { 
                    //User clicked on an actual view (and was not stopping a fling). Itmight be a 
                    //click or a scroll. Assume it is a click until provenotherwise 
                    mTouchMode= TOUCH_MODE_DOWN; 
                    //FIXME Debounce 
                    if(mPendingCheckForTap == null) { 
                        mPendingCheckForTap= new CheckForTap(); 
                    } 
                    postDelayed(mPendingCheckForTap,ViewConfiguration.getTapTimeout()); 
                }else { 
                    if(ev.getEdgeFlags() != 0 &&motionPosition < 0) { 
                        //If we couldn't find a view to click on, but the down event wastouching 
                        //the edge, we will bail out and try again. This allows the edgecorrecting 
                        //code in ViewRoot to try to find a nearby view toselect 
                        returnfalse; 
                    } 
                    if(mTouchMode == TOUCH_MODE_FLING) { 
                        //Stopped a fling. It is a scroll. 
                        createScrollingCache(); 
                        mTouchMode= TOUCH_MODE_SCROLL; 
                        mMotionCorrection= 0; 
                        motionPosition= findMotionRow(y); 
                        reportScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); 
                    } 
                } 
            } 
            if(motionPosition >= 0) { 
                //Remember where the motion event started 
                v= getChildAt(motionPosition -mFirstPosition); 
                mMotionViewOriginalTop= v.getTop(); 
            } 
            mMotionX= x; 
            mMotionY= y; 
            mMotionPosition= motionPosition; 
            mLastY= Integer.MIN_VALUE; 
            break; 
        } 
        caseMotionEvent.ACTION_MOVE: { 
            finalint pointerIndex =ev.findPointerIndex(mActivePointerId); 
            finalint y = (int) ev.getY(pointerIndex); 
            deltaY= y - mMotionY; 
            switch(mTouchMode) { 
            caseTOUCH_MODE_DOWN: 
            caseTOUCH_MODE_TAP: 
            caseTOUCH_MODE_DONE_WAITING: 
                //Check if we have moved far enough that it looks more likea 
                //scroll than a tap 
                startScrollIfNeeded(deltaY); 
                break; 
            caseTOUCH_MODE_SCROLL: 
                if(PROFILE_SCROLLING) { 
                    if(!mScrollProfilingStarted) { 
                        Debug.startMethodTracing("AbsListViewScroll"); 
                        mScrollProfilingStarted= true; 
                    } 
                } 
                if(y != mLastY) { 
                    deltaY-= mMotionCorrection; 
                    intincrementalDeltaY = mLastY != Integer.MIN_VALUE ? y - mLastY :deltaY; 
                     
                    //No need to do all this work if we're not going to moveanyway 
                    booleanatEdge = false; 
                    if(incrementalDeltaY != 0) { 
                        atEdge= trackMotionScroll(deltaY,incrementalDeltaY); 
                    } 
                    //Check to see if we have bumped into the scrolllimit 
                    if(atEdge && getChildCount()> 0) { 
                        //Treat this like we're starting a new scroll from thecurrent 
                        //position. This will let the user start scrolling backinto 
                        //content immediately rather than needing to scroll back tothe 
                        //point where they hit the limit first. 
                        intmotionPosition = findMotionRow(y); 
                        if(motionPosition >= 0) { 
                            finalView motionView = getChildAt(motionPosition -mFirstPosition); 
                            mMotionViewOriginalTop= motionView.getTop(); 
                        } 
                        mMotionY= y; 
                        mMotionPosition= motionPosition; 
                        invalidate(); 
                    } 
                    mLastY= y; 
                } 
                break; 
            } 
            break; 
        } 
        caseMotionEvent.ACTION_UP: { 
            switch(mTouchMode) { 
            caseTOUCH_MODE_DOWN: 
            caseTOUCH_MODE_TAP: 
            caseTOUCH_MODE_DONE_WAITING: 
                setVerticalFadingEdgeEnabled(true); 
                finalint motionPosition = mMotionPosition; 
                finalView child = getChildAt(motionPosition -mFirstPosition); 
                if(child != null &&!child.hasFocusable()) { 
                    if(mTouchMode != TOUCH_MODE_DOWN) { 
                        child.setPressed(false); 
                    } 
                    if(mPerformClick == null) { 
                        mPerformClick= new PerformClick(); 
                    } 
                    finalAbsListView.PerformClick performClick =mPerformClick; 
                    performClick.mChild= child; 
                    performClick.mClickMotionPosition= motionPosition; 
                    performClick.rememberWindowAttachCount(); 
                    mResurrectToPosition= motionPosition; 
                    if(mTouchMode == TOUCH_MODE_DOWN || mTouchMode == TOUCH_MODE_TAP){ 
                        finalHandler handler = getHandler(); 
                        if(handler != null) { 
                            handler.removeCallbacks(mTouchMode== TOUCH_MODE_DOWN ? 
                                    mPendingCheckForTap: mPendingCheckForLongPress); 
                        } 
                        mLayoutMode= LAYOUT_NORMAL; 
                        if(!mDataChanged &&mAdapter.isEnabled(motionPosition)) { 
                            mTouchMode= TOUCH_MODE_TAP; 
                            setSelectedPositionInt(mMotionPosition); 
                            layoutChildren(); 
                            child.setPressed(true); 
                            positionSelector(child); 
                            setPressed(true); 
                            if(mSelector != null) { 
                                Drawabled = mSelector.getCurrent(); 
                                if(d != null && d instanceofTransitionDrawable) { 
                                    ((TransitionDrawable)d).resetTransition(); 
                                } 
                            } 
                            postDelayed(newRunnable() { 
                                publicvoid run() { 
                                    child.setPressed(false); 
                                    setPressed(false); 
                                    if(!mDataChanged) { 
                                        post(performClick); 
                                    } 
                                    mTouchMode= TOUCH_MODE_REST; 
                                } 
                            },ViewConfiguration.getPressedStateDuration()); 
                        }else { 
                            mTouchMode= TOUCH_MODE_REST; 
                        } 
                        returntrue; 
                    }else if (!mDataChanged &&mAdapter.isEnabled(motionPosition)) { 
                        post(performClick); 
                    } 
                } 
                mTouchMode= TOUCH_MODE_REST; 
                break; 
            caseTOUCH_MODE_SCROLL: 
                finalint childCount = getChildCount(); 
                if(childCount > 0) { 
                    if(mFirstPosition == 0 &&getChildAt(0).getTop() >= mListPadding.top&& 
                            mFirstPosition+ childCount < mItemCount&& 
                            getChildAt(childCount- 1).getBottom() <= 
                                    getHeight()- mListPadding.bottom) { 
                        mTouchMode= TOUCH_MODE_REST; 
                        reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); 
                        setVerticalFadingEdgeEnabled(true); 
                    }else { 
                        finalVelocityTracker velocityTracker =mVelocityTracker; 
                        velocityTracker.computeCurrentVelocity(1000,mMaximumVelocity); 
                        finalint initialVelocity = (int)velocityTracker.getYVelocity(mActivePointerId); 
     
                        if(Math.abs(initialVelocity) > mMinimumVelocity){ 
                            if(mFlingRunnable == null) { 
                                mFlingRunnable= new FlingRunnable(); 
                            } 
                            reportScrollStateChange(OnScrollListener.SCROLL_STATE_FLING); 
                             
                            mFlingRunnable.start(-initialVelocity); 
                        }else { 
                            mTouchMode= TOUCH_MODE_REST; 
                            reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); 
                            setVerticalFadingEdgeEnabled(true); 
                        } 
                    } 
                }else { 
                    mTouchMode= TOUCH_MODE_REST; 
                    reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); 
                    setVerticalFadingEdgeEnabled(true); 
                } 
                break; 
            } 
            setPressed(false); 
            //Need to redraw since we probably aren't drawing the selectoranymore 
            invalidate(); 
            finalHandler handler = getHandler(); 
            if(handler != null) { 
                handler.removeCallbacks(mPendingCheckForLongPress); 
            } 
            if(mVelocityTracker != null) { 
                mVelocityTracker.recycle(); 
                mVelocityTracker= null; 
            } 
             
            mActivePointerId= INVALID_POINTER; 
            if(PROFILE_SCROLLING) { 
                if(mScrollProfilingStarted) { 
                    Debug.stopMethodTracing(); 
                    mScrollProfilingStarted= false; 
                } 
            } 
            break; 
        } 
        caseMotionEvent.ACTION_CANCEL: { 
            mTouchMode= TOUCH_MODE_REST; 
            setPressed(false); 
            ViewmotionView = this.getChildAt(mMotionPosition -mFirstPosition); 
            if(motionView != null) { 
                motionView.setPressed(false); 
            } 
            clearScrollingCache(); 
            finalHandler handler = getHandler(); 
            if(handler != null) { 
                handler.removeCallbacks(mPendingCheckForLongPress); 
            } 
            if(mVelocityTracker != null) { 
                mVelocityTracker.recycle(); 
                mVelocityTracker= null; 
            } 
             
            mActivePointerId= INVALID_POINTER; 
            break; 
        } 
         
        caseMotionEvent.ACTION_POINTER_UP: { 
            onSecondaryPointerUp(ev); 
            finalint x = mMotionX; 
            finalint y = mMotionY; 
            finalint motionPosition = pointToPosition(x, y); 
            if(motionPosition >= 0) { 
                //Remember where the motion event started 
                v= getChildAt(motionPosition -mFirstPosition); 
                mMotionViewOriginalTop= v.getTop(); 
                mMotionPosition= motionPosition; 
            } 
            mLastY= y; 
            break; 
        } 
        } 
        returntrue; 
    } 
======================================================================== 
    privateclass FlingRunnable implements Runnable { 
         
        privatefinal Scroller mScroller; 
         
        privateint mLastFlingY; 
        FlingRunnable(){ 
            mScroller= new Scroller(getContext()); 
        } 
        voidstart(int initialVelocity) { 
            intinitialY = initialVelocity < 0 ? Integer.MAX_VALUE :0; 
            mLastFlingY= initialY; 
            mScroller.fling(0,initialY, 0, initialVelocity, 
                    0,Integer.MAX_VALUE, 0, Integer.MAX_VALUE); 
            mTouchMode= TOUCH_MODE_FLING; 
            post(this); 
            if(PROFILE_FLINGING) { 
                if(!mFlingProfilingStarted) { 
                    Debug.startMethodTracing("AbsListViewFling"); 
                    mFlingProfilingStarted= true; 
                } 
            } 
        } 
        voidstartScroll(int distance, int duration) { 
            intinitialY = distance < 0 ? Integer.MAX_VALUE :0; 
            mLastFlingY= initialY; 
            mScroller.startScroll(0,initialY, 0, distance, duration); 
            mTouchMode= TOUCH_MODE_FLING; 
            post(this); 
        } 
        privatevoid endFling() { 
            mTouchMode= TOUCH_MODE_REST; 
            reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); 
            clearScrollingCache(); 
            removeCallbacks(this); 
            if(mPositionScroller != null) { 
                removeCallbacks(mPositionScroller); 
            } 
        } 
        publicvoid run() { 
            switch(mTouchMode) { 
            default: 
                return; 
                 
            caseTOUCH_MODE_FLING: { 
                if(mItemCount == 0 || getChildCount() == 0) { 
                    endFling(); 
                    return; 
                } 
                finalScroller scroller = mScroller; 
                booleanmore = scroller.computeScrollOffset(); 
                finalint y = scroller.getCurrY(); 
                //Flip sign to convert finger direction to list itemsdirection 
                //(e.g. finger moving down means list is moving towards thetop) 
                intdelta = mLastFlingY - y; 
                //Pretend that each frame of a fling scroll is a touchscroll 
                if(delta > 0) { 
                    //List is moving towards the top. Use first view asmMotionPosition 
                    mMotionPosition= mFirstPosition; 
                    finalView firstView = getChildAt(0); 
                    mMotionViewOriginalTop= firstView.getTop(); 
                    //Don't fling more than 1 screen 
                    delta= Math.min(getHeight() - mPaddingBottom - mPaddingTop - 1,delta); 
                }else { 
                    //List is moving towards the bottom. Use last view asmMotionPosition 
                    intoffsetToLast = getChildCount() - 1; 
                    mMotionPosition= mFirstPosition + offsetToLast; 
                    finalView lastView = getChildAt(offsetToLast); 
                    mMotionViewOriginalTop= lastView.getTop(); 
                    //Don't fling more than 1 screen 
                    delta= Math.max(-(getHeight() - mPaddingBottom - mPaddingTop - 1),delta); 
                } 
                finalboolean atEnd = trackMotionScroll(delta,delta); 
                if(more && !atEnd){ 
                    invalidate(); 
                    mLastFlingY= y; 
                    post(this); 
                }else { 
                    endFling(); 
                    AbsListView.this.setVerticalFadingEdgeEnabled(true); 
                    if(PROFILE_FLINGING) { 
                        if(mFlingProfilingStarted) { 
                            Debug.stopMethodTracing(); 
                            mFlingProfilingStarted= false; 
                        } 
                    } 
                } 
                break; 
            } 
            } 
        } 
    } 
 

修改后重新编译,在性能稍差的机器上运行,滚动一下listview或者gridview,你就可以看到比较明显的效果了!


原文:http://blog.sina.com.cn/s/blog_4a6c59d60100pjqc.html

yolov26改进 | 检测头篇 | 利用渐近特征金字塔网络AFPN改进yolov26检测头融合P2网络结构(让小目标无所遁形,全网独家首发) 本文介绍一种基于AFPN渐近特征金字塔网络改进的YOLOv26四检测头Detect_FPN。AFPN通过逐级融合底层细节、中层结构与高层语义特征,缩小不同尺度特征之间的语义差距,减少直接融合带来的信息冲突,使检测头获得更稳定、更充分的多尺度表达。本文进一步增加高分辨率小目标检测分支,强化对微小目标、密集目标和复杂背景目标的感知能力,适合工业缺陷、遥感及无人机等场景。文中将展示基础模型与改进模型的训练对比结果,并提供完整代码、配置文件、模块注册方法及Codex修改思路,方便直接复现和二次创新。 阅读详情

相关推荐

离线AI实战指南:本地部署大模型处理PDF/Word/Excel

离线AI是指在无网络、不上传数据前提下,于个人设备运行大语言模型并完成文档理解、多轮对话与代码辅助等任务的技术方案。其核心依赖本地模型推理、文档解析向量化和轻量级对话调度三大能力。随着Phi-3、Qwen2、Llama3等轻量化开源模型普及,以及Ollama、LM Studio等易用工具成熟,普通用户已可在主流笔记本上实现PDF摘要、合同比对、代码注释等真实办公场景。本文聚焦离线AI的硬件适配、模型选型、文件处理链路与知识库构建,尤其强调中文OCR支持、结构化文档提取与CPU/GPU混合推理优化,助力非开发

weixin_31968639的博客 493

手写Custom Adapter:ListView在2024年高性能实践指南

ListView作为Android原生滚动容器,其核心价值在于极简渲染路径、低内存占用与确定性性能表现。它并非过时技术,而是面向固定结构、高敏感场景(如医保结算、政务审批)的轻量级视图映射方案。Custom Adapter通过ViewHolder模式消除findViewById开销、数据契约解耦绑定逻辑、生命周期感知规避BadTokenException,显著提升列表响应速度与稳定性。相比ArrayAdapter的全量刷新陷阱,自定义实现支持精准通知(notifyItemChanged)、复用路径优化及业务

weixin_30555515的博客 420

保姆级教程:用PyBullet在Windows/Mac上快速搭建你的第一个机器人仿真环境(附避坑指南)

本教程详细介绍了如何使用PyBullet在Windows和Mac上快速搭建机器人仿真环境,包括Python环境配置、依赖安装避坑指南、首个机械臂仿真实现及性能优化技巧。通过分步指导和实战代码,帮助初学者轻松入门机器人仿真技术。

weixin_42526087的博客 407

Android requiresFadingEdge和fadingEdgeLength属性渐变实现

1、最近有一个需求,需要对ListView和recyclerView是否应淡化边缘; 2、在开发中遇到问题发现fadingEdge=“vertical”,fadingEdgeLength="150dp"不生效,于是各种尝试,最终需要增加fadingEdgeLength=“150dp”,requiresFadingEdge="vertical"就可生效; 3、下面我们来看code: 1)先看一下xm...

yuanjl 6443

Ubuntu系统等保3级配置核查与加固

虽然这种方法在某些老旧的系统中仍然有效,但现代Linux发行版通常不推荐使用hosts.deny和hosts.allow文件来管理防火墙规则,因为它们的功能已经被更现代的防火墙管理工具(如iptables或firewalld)所取代。如果你想禁止特定的环境变量,可以从这个列表中移除它们,或者如果你想完全阻止所有环境变量的传递,可以将其设置为空。你可以通过ssh-keygen生成密钥对,并将公钥添加到用户的~/.ssh/authorized_keys文件中。修改配置后,需要重启SSH服务以使更改生效。

悦分享 183

手把手教你玩转CPU微架构专栏--​​​​1.5 工具准备:用Gem5模拟器“看见”微架构(安装、基础仿真命令)​

本文介绍了如何使用Gem5模拟器进行微架构学习和实验。Gem5是一款支持多种指令集的开源微架构模拟器,可模拟CPU流水线、缓存等核心组件。文章详细说明了在Ubuntu和macOS上安装Gem5的步骤,包括依赖安装、源码编译和验证方法。通过一个简单的加法指令测试程序,演示了如何运行基础仿真并解读输出日志,包括指令执行流程和性能统计数据。此外,还提供了两个实战实验:修改L1缓存大小和观察分支预测失败,帮助读者理解微架构参数对性能的影响。最后指出Gem5是学习微架构的"显微镜",能直观观察指令

xiaoheshang_123的博客 140

Android AbsListView坐标体系解析

 Android AbsListView坐标体系解析 Android的AbsListView与Android ListView不同,AbsListView代表了一个抽象的列表View。在实际的开发中直接使用Android ListView几乎可以完全完成所有与List这类View相关的开发任务,但在极个别情况下, 需要深入到Android的AbsListView中进行仔细的坐标定位。 为

Zhang Phil 5723

30、电力生产系统中的效率测量

本文探讨了如何使用数据包络分析(DEA)模型来评估电力生产系统的效率。文章详细介绍了电力生产系统的三个主要环节——发电、输电和配电,并通过多种DEA模型,如输入导向模型、输出导向模型以及基于松弛的SBM模型,展示了效率测量的方法和技术。同时,结合实际案例分析,说明了DEA模型在识别效率低下环节及提出改进建议方面的应用价值。

rgv2345678的博客 116

Android自定义View缓冲,android : 自定义无上下缓冲色的ScrollView 类名称:NoFadingScrollView...

public class NoFadingScrollView extends ScrollView {// private static final int MAX_Y_OVERSCROLL_DISTANCE =65;// private int mMaxYOverscrollDistance;private ScrollViewInterface scrollViewInterface;pub...

weixin_35097989的博客 226

基于射频技术的校园无人超市管理系统_360

本设计实现了一种基于射频技术的校园无人超市管理系统,系统集成了环境监测与商品管理两大核心模块。在环境监测部分,采用DHT11温湿度传感器与MQ2烟雾传感器对超市内部环境进行实时监测,结合温控与报警机制,实现自动通风与烟雾报警功能,并通过1.44寸SPI LCD显示屏进行本地信息显示。商品管理部分基于RC522-RFID读卡器完成商品识别,结合Qt上位机软件实现顾客自助选购与结算,同时支持管理员进行商品入库与会员卡管理等操作。系统采用STM32F103RCT6为主控核心,结合串口通信方式与Qt开发的上位机进行

375

【20260309】【亲测可用】【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled

【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection。

奶爸的编程之路,也就一周冷个三天 2万+

Android BaseAdapter详解:原理、优化与实战应用

适配器是Android开发中连接数据与UI的核心组件,BaseAdapter作为基础抽象类提供了高度灵活的视图复用机制。其核心原理通过getView()方法实现数据绑定,配合ViewHolder模式显著提升列表性能。在电商商品列表、聊天界面等复杂场景中,多类型布局和异步加载技术能有效解决内存管理问题。随着View Binding和Data Binding等现代技术的引入,BaseAdapter开发模式正变得更加高效。掌握视图复用、内存优化等关键技巧,能够帮助开发者构建流畅的列表界面,特别是在处理大规模数据展

chupu2979的博客 354

「深度学习之优化算法」笔记(二)优化算法的分类

但是由于生物的局限性,人们所创造出的算法也会有局限性:我们所熟知的生物都生存在三维空间,在这些环境中,影响生物生存的条件比较有限,反应到算法中就是这些算法在解决较低维度的问题时效果很好,当遇到超高维(维度>500)问题时,结果可能不容乐观,没做过实验,我也不敢乱说。当然,他们的目的不是在最佳狩猎位置集合,他们的目的是在过去的途中看是否能发现更加好的狩猎位置,去往已经到过的狩猎地点再次狩猎是没有意义的,因为每个位置获取食物的难易程度是固定的。如果他们的策略是“不跟随最优解”,那么他们的策略是什么呢?

quanzhan_King的博客 1371

Android 中文 API(123) —— AbsListView(一)

前言   本章内容是android.widget.AbsListView,版本为Android 2.3 r1,翻译来自"cnmahj",欢迎大家访问他的博客:http://android.toolib.net/blog/,再次感谢"cnmahj"!欢迎你一起参与Android的中文翻译,联系我over140@gmail.com。     声明   欢迎转载,但请保留文章原始出处:)...

weixin_33692284的博客 262

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android widget 布局,Android Widget Attributes——View

最近因为想着重新把这个插件捡起来,把view的属性慢慢的全部补上,所以顺便了解一下各个属性,在这里列举View的属性,含义,以及代码设置。简书Markdown编辑器实在是渣,只能把表格换成下面这种形式android:idvoid setId(int);设置id,单个布局中保持唯一。可以用View.generateViewId()来生成。android:accessibilityLiveRegion...

weixin_30843121的博客 1314

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android TV listView焦点平滑移动

智能电视 listView 焦点 平滑移动

欢迎关注公众号:【码农突围】,公号后台回复9999,可以获取一份500页的LeetCode刷题笔记。 5515

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

三、Listview优化和常用设置

listview 是Android开发中最熟悉的控件了,经过2年的工作和学习,熟悉和积累了几种优化的方式; 1:在getView中编写带有缓存的代码 @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder;

niu0147的专栏 567

AbsListView小结

1.滚动时,无论时FlingMode还是ScrollMode,最终都是调用trackMotionScroll(),其中包括了View回收的计算及执行,trackMotionScroll()使用了offsetChildrenTopAndBottom()对children做坐标变换。 2.ScrollMode时,主要调用scrollIfNeeded(int x, int y, MotionEvent...

淡淡的宁静的博客 1027

Android开发——ListView的复用机制源码解析

0.前言前段时间找工作,看了很多人的面经,不得不说找个工作很麻烦。尤其是Android,岗位的数量比不上前端后Java后台也就算了,问的东西又多又杂,这里就不多列举了,其中有一个印象比较深的问题是关于ListView复用机制的。复用机制谁都会用,但是却不一定能真正讲清楚。因此才有了此文。1. ListView的继承关系和Adapter的由来ListView直接继承自的AbsListVi...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 2331

Android--ListView作用详解

1.ListView   ListView列表视图控件是Android中常用的控件之一,其直接继承了AbsListView,是一个以垂直方式在项目中显示View视图的列表。ListView的数据项,来自一个继承了ListAdapter接口的适配器。   ListView的常用属性一般就是用来设置列表的间隔、分割线、表头、表尾等属性的,常用属性有以下几个,并且Android也为其提供了对应的se...

streate的专栏 5705

Android WebView 相关问题解决

WebView快速滑动时,屏幕出现黑线问题: 在WebView页面快速上下滑动时,屏幕上方或下方出现一条黑线,解决: webView.setVerticalFadingEdgeEnabled(false); WebView 发送POST请求: webView.postUrl(url, postDataStr.getBytes());//postDataStr为post请求体,...

sinat_22910799的博客 402

Android ListView工作原理完全解析,带你从源码的角度彻底理解

在Android所有常用的原生控件当中,用法最复杂的应该就是ListView了,它专门用于处理那种内容元素很多,手机屏幕无法展示出所有内容的情况。ListView可以使用列表的形式来展示内容,超出屏幕部分的内容只需要通过手指滑动就可以移动到屏幕内了。 另外ListView还有一个非常神奇的功能,我相信大家应该都体验过,即使在ListView中加载非常非常多的数据,比如达到成百上千条甚至更多,ListView都不会发生OOM或者崩溃,而且随着我们手指滑动来浏览更多数据时,程序所占用的内存竟然都不会跟着增长。那

郭霖的专栏 15万+

AbsListView 浅析

Base class that can be used to implement virtualized lists of items. A list does  not have a spatial definition here. For instance, subclases of this class can display the content of the list in a g

编程生活 6703

scrollView上下滚item淡入淡出效果

scrollView上下滚item淡入淡出效果直接设置scrollView.setVerticalFadingEdgeEnabled(true); scrollView.setFadingEdgeLength(xxxx);即可达到两个端淡入淡出效果,listView也可以,注意这两个方法为View的方法。

FIRE_TRAY的Android之路 2354
上一篇: Activity, Service,Task, Process and Thread之间的关系
下一篇: Android高手进阶教程(二十七)之---基于ViewFlipper实现的自定义新手指引控件.
SpeedyCoder
博客等级 码龄14年 415粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值