先上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);
}