关于安卓毛玻璃实现(二)动态毛玻璃recyclerview

计算机软件开发 2024-10-5 07:17:51 26 0 来自 中国
上文说到,一个单独的页面实现毛玻璃
博客地点
但是现在,这种方案放在了recyclerview中,就会有性能标题了,为什么?recyclerview由于其加载数据的缓存性子,会同时加载多个view,假如全部view都在做动态毛玻璃,那性能开销可想而知。
!!!代码地点在文末!!!

环境:

1、win10 androidstudio4.4.0
2、jdk 1.8
场景:

recyclerview利用了linearlayoutmanager,pagersnaphelper分页滑动。
思绪:

假如镌汰性能开销?有一下方法:
(一)用户滑动recyclerview的时间,停息动态毛玻璃
(二)毛玻璃控件失去焦点的时间,停息毛玻璃
(三)非当前页体现时,停息毛玻璃
实现:

(一)通过界说一些对象,分别记载当前用户的滑动位置,滑动状态(滑动中,制止滑动)等。再联合毛玻璃在recyclerview中的位置,举行比对实现。焦点代码如下:
            if(getmAdapterPos() == LibPicBlurDragConstant.getInstance().getDragPos()){                if(LibPicBlurDragConstant.getInstance().isDrag()){                    return false;                }            }上面代码的意思就是,假如拖动位置和当前毛玻璃控件位置相当且拖动中,就停息毛玻璃举动。
(二)失去监听的判断,通过以下代码即可捕捉:
    @Override    public void onWindowFocusChanged(boolean hasWindowFocus) {        super.onWindowFocusChanged(hasWindowFocus);        Log.d(TAG, "onWindowFocusChanged hasWindowFocus: " + hasWindowFocus + " mIdentify: " + mIdentify);        if (hasWindowFocus) {            setCanBlur(true);        } else {            setCanBlur(false);        }    }(三)由于毛玻璃的位置,是通过windowlocation方法获取的,以是,只要得出离屏位置,即可得出是否在当前页面。注意!!!
调用该库中,必要自界说一个父类布局(recyclerview场景),替换为原来的Window DecoreView,由于这里涉及的是一个动态绘制体现的标题,以是要替换。焦点代码如下:
离屏位置判断:
            final int[] locations = new int[2];//            parentView.getLocationOnScreen(locations);//            Log.d(TAG, "checkScreenLocation " + mIdentify + " parentSc: " + locations[1] + " parentHe: " + parentView.getMeasuredHeight());            getLocationOnScreen(locations);            int childScreenHeight = locations[1];//            Log.d(TAG, "checkScreenLocation " + mIdentify + " childSc: " + locations[1] + " childHe: " + getMeasuredHeight());            //离屏位置----------------------------------------------------------            if (childScreenHeight <= 0) {                //上一页                return false;            }            if (childScreenHeight >= parentView.getMeasuredHeight()) {                return false;            }            //离屏位置----------------------------------------------------------自界说decoreview设置:
    protected View getActivityDecorView() {        if(mCusDecorView!=null){            return mCusDecorView;        }        Context ctx = getContext();        for (int i = 0; i < 4 && !(ctx instanceof Activity) && ctx instanceof ContextWrapper; i++) {            ctx = ((ContextWrapper) ctx).getBaseContext();        }        if (ctx instanceof Activity) {            return ((Activity) ctx).getWindow().getDecorView();        } else {            return null;        }    }    public void setmCusDecorView(View mCusDecorView) {        this.mCusDecorView = mCusDecorView;    }至此,全部代码已经列出。

代码地点
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:45, Processed in 0.128811 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表