首页 > 其他分享 >app日常优化总结

app日常优化总结

时间:2022-11-08 13:56:15浏览次数:42  
标签:MotionEvent false parent requestDisallowInterceptTouchEvent 优化 app 日常 ACTION evt

滑动冲突

有时候viewpager嵌套webview后,左右滑动冲突,直接消费或者处理拦截导致上下不能滑动,所以需要根据滑动情况判断处理,只在上下滑动时判断事件交给子view

class ScrollWebView(context: Context, attrs: AttributeSet) : WebView(context, attrs) {

    private var mSlop = 0
    private var mDownY = 0f

    init {
        mSlop = ViewConfiguration.get(context).scaledTouchSlop
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        when (event?.action) {
            MotionEvent.ACTION_DOWN -> mDownY = event.y
            MotionEvent.ACTION_MOVE -> {
                val off = mDownY - event.y
                if (abs(off) >= mSlop) {
                    parent.requestDisallowInterceptTouchEvent(true)
                }
            }
            MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                parent.requestDisallowInterceptTouchEvent(false)
            }
        }
        return super.onTouchEvent(event)
    }
}

举一反三,很多滑动冲突都可以类似解决,至于是对父容器处理,还是子节点处理,根据情况来定

又比如在viewpager下嵌套Recyclerview,Recyclerview中又嵌套viewpager或者Recyclerview,此时子view左右滑动起了冲突,这个确实不怪业务逻辑复杂了,只能自定义解决了

class NestedViewPager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) {

    private var x1 = 0f
    private var y1 = 0f
    private var isScroll = false

    override fun dispatchTouchEvent(evt: MotionEvent?): Boolean {
        evt?.let {
            when (evt.action) {
                MotionEvent.ACTION_DOWN -> {
                    x1 = evt.x
                    y1 = evt.y
                    isScroll = false
                }
                MotionEvent.ACTION_MOVE -> {
                    // 通知其父控件不拦截
                    val x2 = evt.x
                    val y2 = evt.y
                    if (x1 - x2 > 1) {
                        //str = "向右滑"
                        parent.requestDisallowInterceptTouchEvent(true)
                        isScroll = false
                    } else if (x2 - x1 > 1) {
                        //str = "向左滑"
                        parent.requestDisallowInterceptTouchEvent(true)
                        isScroll = false
                    } else if (y1 - y2 > 100) {
                        parent.requestDisallowInterceptTouchEvent(false)
                        //str = "向上滑"
                        isScroll = true
                    } else if (y2 - y1 > 100) {
                        parent.requestDisallowInterceptTouchEvent(false)
                        //str = "向下滑"
                        isScroll = true
                    }
                }
                MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                    if (isScroll) {
                        parent.requestDisallowInterceptTouchEvent(false)
                    } else {
                        parent.requestDisallowInterceptTouchEvent(true)
                    }
                }
            }
        }
        return super.dispatchTouchEvent(evt)
    }

}

依然一顿梭哈解决,但是能不自定义就别自定义,特别是复杂的定义

webview卡顿

一般情况下webview不会卡顿,除非用法不但,或者确实由于网页导致的,如果是网页导致的只能本地化或者缓存或者预加载处理,但是如果是用法不但就需要自己找原因了

比如有时候代码写的烂,界面刷新频繁导致webview闪烁,就会关闭硬件加速 webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null),但是后来会发现滑动卡顿了,那肯定不能这么干

打开硬件加速,优化更新逻辑,问题解决

 

标签:MotionEvent,false,parent,requestDisallowInterceptTouchEvent,优化,app,日常,ACTION,evt
From: https://www.cnblogs.com/LiuZhen/p/16869201.html

相关文章

  • React性能优化的8种方式
    一引沿Fiber架构是React16中引入的新概念,目的就是解决大型React应用卡顿,React在遍历更新每一个节点的时候都不是用的真实DOM,都是采用虚拟DOM,所以可以理解成fiber就是R......
  • ​给前端开发者的 14 个 JavaScript 代码优化建议
    英文|https://blog.bitsrc.io/14-javascript-code-optimization-tips-for-front-end-developers-a44763d3a0da作者| MahdhiRezvi译文| https://github.com/xitu/gold......
  • uniapp打包小程序运行到微信开发工具
    1.在manifest.json文件中配置AppID  2.在HBuilderX中配置微信开发者工具的安装路径。工具->设置->运行设置 3.  在微信开发者工具中配置设置->安全设置->开启......
  • 性能优化的方法(上)
    引言:取与舍软件设计开发某种意义上是“取”与“舍”的艺术。关于性能方面,就像建筑设计成抗震9度需要额外的成本一样,高性能软件系统也意味着更高的实现成本,有时候与其他质......
  • 性能优化的方法(中)
    引言前面我们总结了六种普适的性能优化方法,包括 索引、压缩、缓存、预取、削峰填谷、批量处理,简单讲解了每种技术手段的原理和实际应用。在开启最后一篇前,我们先需要搞......
  • uniapp不使用自定义tabbar的情况下隐藏指定的tabbar
    uni给提供的api中uni.hideTabBar()是控制所有的tabbar显示和隐藏,并不能达到我们想要的效果图,但是我仔细看过文档后发现uni.setTabBarItem()中有visible这个选项控......
  • 如何使用 button 唤起 uni-app 的 uni-file-picker
    最近碰到一个需求,就是在头像下方可以点击更换头像,同时,点击头像也可以更换头像。因为项目用的是uni-app,所以说到上传头像,就想到了 uni-file-picker,但是我翻完了 uni-fil......
  • uniapp/微信小程序 项目day03
    一.商品列表1.1获取数据首先能够进入商品列表的途径传的数据有了解了这个之后就可以开始了,先创建分支创建编译模式,并分配初试数据这个时候就可以获取数据了......
  • 日常Linux命令--vi/vim复制一行,粘贴
    在光标的位置按“yy”,复制当前行;然后再光标的行按“p”,粘贴到下一行,原来的往下顺移。举例:复制前   按"yy",在"p"   另外:删除当前行-------dd复制多行--......
  • boostrap.yml 与 application.yml 详解
    boostrap.yml与application.yml详解​ 官方解释:SpringBoot中有两种上下文,bootstrap和applicationbootstrap:应用程序的父上下文,即bootstrap加载优先于applicato......