import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class TvListAdapter1 extends RecyclerView.Adapter<TvListAdapter1.ViewHolder> {
private List<String> data;
private RecyclerView recyclerView;
public TvListAdapter1(List<String> data,RecyclerView recyclerView){
this.data = data;
this.recyclerView = recyclerView;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_r1,parent,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.textView.setText(data.get(position));
}
@Override
public int getItemCount() {
return data.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public ViewHolder(@NonNull final View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_r1);
itemView.setFocusable(true);
itemView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){
int[] amount = getScrollAmount(recyclerView, v);//计算需要滑动的距离
recyclerView.smoothScrollBy(amount[0], amount[1]);
itemView.setTranslationZ(20);//阴影
ofFloatAnimator(itemView,1f,1.2f);//放大
}else {
itemView.setTranslationZ(0);
ofFloatAnimator(itemView,1.2f,1f);
}
}
});
}
}
/**
* 计算需要滑动的距离,使焦点在滑动中始终居中
* @param recyclerView
* @param view
*/
private int[] getScrollAmount(RecyclerView recyclerView, View view) {
int[] out = new int[2];
final int parentLeft = recyclerView.getPaddingLeft();
final int parentTop = recyclerView.getPaddingTop();
final int parentRight = recyclerView.getWidth() - recyclerView.getPaddingRight();
final int childLeft = view.getLeft() + 0 - view.getScrollX();
final int childTop = view.getTop() + 0 - view.getScrollY();
final int dx =childLeft - parentLeft - ((parentRight - view.getWidth()) / 2);
final int dy = childTop - parentTop - (parentTop - view.getHeight()) / 2;
out[0] = dx;
out[1] = dy;
return out;
}
//放大动画
private void ofFloatAnimator(View view, float start, float end){
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(700);//动画时间
ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", start, end);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", start, end);
animatorSet.setInterpolator(new DecelerateInterpolator());//插值器
animatorSet.play(scaleX).with(scaleY);//组合动画,同时基于x和y轴放大
animatorSet.start();
}
}
代码中调用:
RecyclerView tvList1;
TvListAdapter1 adapter1;
final String[] data = {
"A", "B", "C", "D", "E",
"F", "G", "H", "I", "J",
"A", "B", "C", "D", "E",
"F", "G", "H", "I", "J"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tv_list);
tvList1 = findViewById(R.id.tvList1);
LinearLayoutManager layoutManager = new LinearLayoutManager(this,
LinearLayoutManager.HORIZONTAL,false);
tvList1.setLayoutManager(layoutManager);
adapter1 = new TvListAdapter1(Arrays.asList(data),tvList1);
tvList1.setAdapter(adapter1);
}