前言:最近有个需求要做一个管理类的页面,需要使用GridView,使用遥控器移动到相应的Item时,当前的Item就会放大,而可以替换背景
View 放大代码
自定义一个类写一下方法使用scalesX和scalesY即可
public static void scaleView(View view,boolean hasFocus){
float scale=hasFocus?1.2f:1.0f;
view.animate().scaleX(scale).scaleY(scale).setInterpolator(new AccelerateDecelerateInterpolator()).setDuration(200);
}
public static void scaleViewlast(View view,boolean hasFocus){
float scale=hasFocus?1.0f:1.0f;
view.animate().scaleX(scale).scaleY(scale).setInterpolator(new AccelerateDecelerateInterpolator()).setDuration(200);
}
核心代码:
在创建适配器的时候,将每一个View保存下来,使用setOnFocusChangeListener监听焦点情况,获得焦点时,在适配器中定义一个View来保存第一个Item,当获得焦点时则将第一个Item放大,注意,不要让GridView一开始就获得焦点,不然你会发现一直报空指针,每次将当前的View保存到lastView,在移动到下一个时将上一个View放小,在将当前View放大即可
grid.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus){
if (firstView==null){
Log.i("测试", String.valueOf(adapter.returnView()));
firstView=adapter.returnView();
ViewUtils.scaleView(firstView,true);
lastView=firstView;
}else {
ViewUtils.scaleView(firstView,true);
lastView=firstView;
}
grid.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (lastView!=null){
ViewUtils.scaleViewlast(lastView,true);
}
ViewUtils.scaleView(view,true);
lastView=view;
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}else {
ViewUtils.scaleViewlast(lastView,true);
}
}
});
初始状态
放大
完整Demo
https://download.csdn.net/download/qq_30926503/13061752