Focus
requestFocus():强制设置一个焦点到指定的view或它的一个子类,(前提是android:focusable为true能够获得焦点)
android:focusable:设置一个控件能否获得焦点
android:background:设置在作为背景的drawable
android:nextFocusDown:定义下一个获得焦点的控件当按下键时
android:nextFocusUp:定义下一个获得焦点的控件当按上键时
android:nextFocusLeft:定义下一个获得焦点的控件当按左键时
android:nextFocusRight:定义下一个获得焦点的控件当按右键时
xml布局设置
<RelativeLayout
android:id="@+id/rl_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/gridview_item_select"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:padding="4dp">
<TextView
android:id="@+id/item_name"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:duplicateParentState="true"
android:ellipsize="marquee"
android:gravity="center"
android:singleLine="true"
android:textSize="12sp"
/>
</RelativeLayout>
gridview_item_select xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/corner_rectangle"/>
<item android:state_focused="true" android:drawable="@drawable/corner_rectangle" />
<item android:state_pressed="true" android:drawable="@drawable/corner_rectangle"/>
<item android:drawable="@android:color/transparent"/>
</selector>
其中corner_rectangle xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--圆角度数-->
<corners
android:radius="15dp"
/>
<!--边宽宽度及边宽颜色-->
<stroke
android:width="2dp"
android:color="@color/white"/>
<solid
android:color="@color/transparent"
/>
</shape>
这样当view rl_home获取焦点时,背景框就变了,也可以将 .9.png代替corner_rectangle文件,.9.png文件可以实现焦点边框泛光的效果。
给view添加focuschangelistener监听,当view获取焦点时显示放大动画,失去焦点时缩小正常。
private View mCurrentView;
public View.OnFocusChangeListener mFocusChangeListener = new View.OnFocusChangeListener() {
@Override
//设置焦点事件
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
mCurrentView = v;
enlargeAnim(v);
} else {
reduceAnim(v);
}
}
};
public View getCurrentView() {
return mCurrentView;
}
public void requestInitFocus() {
}
public View.OnFocusChangeListener getFocusChangeListener() {
return mFocusChangeListener;
}
public void enlargeAnim(View v) {
//animation:animation.AnimationUtils.loadAnimation(context,id);动画效果
Animation a = android.view.animation.AnimationUtils.loadAnimation(v.getContext(), R.anim.base_enlarge);
a.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
});
a.setFillAfter(true);
v.clearAnimation();
v.setAnimation(a);
v.bringToFront();
a.start();
}
public void reduceAnim(View v) {
Animation a = android.view.animation.AnimationUtils.loadAnimation(v.getContext(), R.anim.base_reduce);
a.setFillAfter(true);
v.clearAnimation();
v.startAnimation(a);
a.start();
}