天天看点

android Tv RecyclerView焦点居中

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);



    }