TV焦点监听-焦点处动画放大-焦点框
为要实现动画放大的View实现自定义的View.OnFocusChangeListener;
要放大的倍数可以通过View的setTag(…)设置,也可以直接在自定义的焦点监听类设置常数;
最后,如果要焦点处放大后还能显示焦点框,View如果是xml,则设置
android:background="@drawable/task_fc_itemborder"
这个drawble文件如下:亲测用selector/item/shape有效显示焦点框;
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<shape>
<solid android:color="#fff"/>
<size android:width="340dp"
android:height="170dp"/>
<stroke android:color="#fff"
android:width="10dp"/>
</shape>
</item>
<item>
<shape>
<solid android:color="#00000000"/>
<size android:width="340dp"
android:height="170dp"/>
<stroke android:color="#00000000"
android:width="10dp"/>
</shape>
</item>
</selector>
代码动态设置的话:
mView.setBackgroundResource(R.drawable.task_fc_itemborder);
public class AnimateFocusChangeListener implements View.OnFocusChangeListener {
private static float DEFAULT_SCALE_X = 1.1f;
private static float DEFAULT_SCALE_Y = 1.1f;
private FocusScaleListenerCallback mFocusCallback;
public AnimateFocusChangeListener(){
this(null);
}
public AnimateFocusChangeListener(FocusScaleListenerCallback tCallback){
mFocusCallback = tCallback; //这里可选;设置回调的接口
}
@Override
public void onFocusChange(final View v, boolean hasFocus) {
if (hasFocus) { // 有焦点放大,无则回原大小
if (mFocusScaleX == 0) {
Float tXObject = (Float) v.getTag(R.id.track_view_scale_x); //在这里得到之前View设置的放大倍数;
mFocusScaleX = (tXObject == null ? DEFAULT_SCALE_X : tXObject);
}
if (mFocusScaleY == 0) {
Float tYObject = (Float) v.getTag(R.id.track_view_scale_y);
mFocusScaleY = (tYObject == null ? DEFAULT_SCALE_Y : tYObject);
}
v.animate().scaleX(mFocusScaleX).scaleY(mFocusScaleY).start();
v.requestLayout();
} else {
v.animate().scaleX(1.0f).scaleY(1.0f).start();
}
if (mFocusCallback != null){
mFocusCallback.focusScaleCallback(v, hasFocus); //可选;调用回调
}
}
}