记录下TvRecycleView控件的飞框实现方式

先上code,代码是从TvRecycleView中拷贝过来的,敲了一边特此记录下学习的过程。
https://github.com/yuboxiao/Launcher_learn

好了,话不多说,开始分析:

1. 先看下类图关系:

这个是整个飞框类图

2. 源码分析

2.1 如下是主要的构造函数

 @Override
        public FocusBorder build(Activity activity) {
            if (null == activity) {
                throw new NullPointerException("The activity cannot be null");
            }
            ViewGroup parent = (ViewGroup) activity.findViewById(android.R.id.content);
            return build(parent);
        }

        @Override
        public FocusBorder build(ViewGroup parent) {
            if (null == parent) {
                throw new NullPointerException("The FocusBorder parent cannot be null");
            }

            final ColorFocusBorder boriderView = new ColorFocusBorder(parent.getContext(),
                    mShimmerColor, mShimmerDuration, mIsShimmerAnim, mAnimDuration, mPaddingOfsetRectF,
                    mShadowColor, mShadowWidth, mBorderColor, mBorderWidth);
            final ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(1, 1);
            //其实就是在顶层的rootView上又放置了一个boriderView边框视图
            parent.addView(boriderView, lp);
            return boriderView;
        }

2.2 如何绘制边框和闪光

/**
     * 绘制外发光阴影
     *
     * @param canvas
     */
    private void onDrawShadow(Canvas canvas) {
        if (mShadowWidth > 0) {
            canvas.save();
            //裁剪处理(使阴影矩形框内变为透明)
            if (mRoundRadius > 0) {
                //裁减画布,裁减出来一个矩形
                canvas.clipRect(0, 0, getWidth(), getHeight());
                mTempRectF.set(mFrameRectF);
                //嵌入,可以指定背景的大小,可以不用填充整个屏幕
                mTempRectF.inset(mRoundRadius / 2f, mRoundRadius / 2f);
                canvas.clipRect(mTempRectF, Region.Op.DIFFERENCE);
            }
            //绘制外发光阴影效果
            canvas.drawRoundRect(mFrameRectF, mRoundRadius, mRoundRadius, mShadowPaint);
            canvas.restore();
        }
    }

    /**
     * 绘制边框
     *
     * @param canvas
     */
    private void onDrawBorder(Canvas canvas) {
        if (mBorderWidth > 0) {
            canvas.save();
            mTempRectF.set(mFrameRectF);
            /**
             * mTempRectF 矩形区域
             * mRoundRadius 圆角
             * mBorderPaint 画笔
             */
            canvas.drawRoundRect(mTempRectF, mRoundRadius, mRoundRadius, mBorderPaint);
            canvas.restore();
        }
    }

最后介绍下使用方式:
1、构造出来飞框的变量,做一些设置

   /**
     * 移动飞框
     */
    private FocusBorder mFocusBorder;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mFocusBorder = new FocusBorder.Builder()
                .asColor()
                .borderColor(getResources().getColor(R.color.actionbar_color))
                .borderWidth(TypedValue.COMPLEX_UNIT_DIP, 2)
                .shadowColor(getResources().getColor(R.color.green_bright))
                .shadowWidth(TypedValue.COMPLEX_UNIT_DIP, 18)
                .build(getActivity());
    }

2、处理移动边框的事件

/**
     * 处理移动边框的事件
     * @param focusedView
     * @param scale
     * @param roundRadius
     */
    protected void onMoveFocusBorder(View focusedView, float scale, float roundRadius) {
        if(null != mFocusBorder) {
            mFocusBorder.onFocus(focusedView,
                    FocusBorder.OptionsFactory.get(scale, scale, roundRadius));//ScaleX.ScaleY
        }
    }

3、在item被选中的事件中进行回调

 /**
                 * 这个就是当itemView被选中时候的回调的函数,用作移动飞框
                 * @param parent
                 * @param itemView
                 * @param position
                 */
                @Override
                public void onItemSelected(TvRecyclerView parent, View itemView, int position) {
                    float radius = 10.0f;
                    onMoveFocusBorder(itemView, 1.1f, radius);
                }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值