本篇文章已授权微信公众号DriodDeveloper(逆流的鱼yuiop)独家发布
从初TV开发到现在,在移动边框上用过很多方法。
下面我来简单的列出来使用过那些解决方法和思路:
- 1,在所有需要放大和设置边框的View下方嵌套一层FrameLayout,作为放大的背景的容器。焦点移动上去,算出当前View的大小,然后再设置FrameLayout的大小与.9图片并bringtoFront();
- 2,为每个需要放大与突出的View设置shape和selector,这个是我最推荐的方法,现在很多TV的APP都采用这种,但是有个缺点,发光和阴影并不能设置。这与需要稍微有点炫酷效果的桌面有点不符合。
- 3,全局FrameLayout,这个是我现在在用的方法,现在已经整理成一套框架,不久就会开源,现在还有示例Demo未完成。
下面让我们来进入我的框架的主题来看一下:
红圈所标出来的是几个主要的类与自定义View,下面我们来深入(我在设计的时候,焦点处理是各自处理各自的,解耦)。
先上两幅比较难的界面(重点在于焦点的处理与动画的处理,图一有动态的添加和删除)。
最主要的接口MoveAnimationHelper(做动画效果的)如下:
/**
* Created by ShanCanCan on 2016/4/3 0003.
*/
public interface MoveAnimationHelper {
void drawMoveView(Canvas canvas);//绘制MoveView
void setFocusView(View currentView, View oldView, float scale); //放大缩小函数
void rectMoveAnimation(View currentView, float scaleX, float scaleY);// 边框移动函数
MoveFrameLayout getMoveView(); //边框view
void setMoveView(MoveFrameLayout moveView);//setMoveView
void setTranDurAnimTime(int time);//设置移动时间
void setDrawUpRectEnabled(boolean isDrawUpRect);//是否凸出显示
}
MoveFrameLayout是全局的移动飞框,就像文章开头的1的实现类似,但是全局只有一个。
最主要的绘制函数就是 MoveFrameLayout这个类了,这个类就是我们的边框移动 View,这个 View 主要实现边框的生成与移动,还有阴影的添加
/**
*
* Created by ShanCanCan on 2016/4/3 0003.
*/
public class MoveFrameLayout extends FrameLayout {
private static final String TAG = "MoveFramLayout";
private Context mContext;
private Drawable mRectUpDrawable;
private Drawable mRectUpShade;
private MoveAnimationHelper mMoveAnimationHelper;
private RectF mShadowPaddingRect = new RectF();
private RectF mUpPaddingRect = new RectF();
public MoveFrameLayout(Context context) {
super(context);
init(context);
}
public MoveFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public MoveFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
mContext = context;
setWillNotDraw(false);//必须要设置,如果我们想要重写onDraw,就要调用setWillNotDraw(false)
mMoveAnimationHelper = new MoveAnimationHelperImplement();//动画的实现类,接下来就要讲解
mMoveAnimationHelper.setMoveView(this);
}
/*下面的方法基本是调用MoveAnimationHelperImplement的实现方法,来进行我们的放大缩小以及其他展示*/
public void setFocusView(View currentView, View oldView, float scale) {
mMoveAnimationHelper.setFocusView(currentView, oldView, scale);
}
public View getUpView() {
return this;
}
@Override
protected void onDraw(Canvas canvas) {
if (mMoveAnimationHelper != null) {
mMoveAnimationHelper.drawMoveView(canvas);
return;
}
super.onDraw(canvas);
}
public void setUpRectResource(int id) {
try {
this.mRectUpDrawable = mContext.getResources().getDrawable(id); // 移动的边框.
invalidate();
} catch (Exception e) {
e.printStackTrace();
}
}
public void setUpRectShadeResource(int id) {
this.mRectUpShade = mContext.getResources().getDrawable(id); // 移动的边框.
invalidate();
}
public Drawable getShadowDrawable() {
return this.mRectUpShade;
}
public Drawable getUpRectDrawable() {
return this.mRectUpDraw