package com.wasu.cs.widget; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.OvershootInterpolator; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; import com.wasu.frescoimagefetchermodule.FrescoImageFetcherModule; import cn.com.wasu.main.R; /** * Created by chenming on 2016/11/4. * * @Description: 少儿频道首页中的tab控件 * @email chenming@wasu.com */ public class HorentialFocusRecycleView extends RecyclerView { // self private HorentialFocusRecycleView mRecycleView; // context private Context mContext; // 布局管理器 private LinearLayoutManager mLayoutManager; //栏目名称 private String[] names; //栏目卡通头像对应的uri private String[] uris; // 记录当前的位置(0是初始位置) private int mViewPos = 0; // Adapter全局(用于刷新数据) private MyTabAdapter mMyTabAdapter; // 点击事件 private OnItemClickListener itemClickListener; // 焦点变换事件 private OnItemFocusChangeListener onItemFocusChangeListener; // item存在的布局文件 private int mItemLayout; // 三个drawable三种样式 private Drawable tabdefault, tabfocused, tabindicator; // leaveTag 失去焦点 private ScrollView parentscroll; private View upFocusView; private View downFocusView; private boolean mLeaveTag = false; private int tabsCount = 0; private TranslateAnimation shakeAnim; /*private static final int[] picres = {R.drawable.spongebob, R.drawable.ggbond, R.drawable.verney, R.drawable.insect, R.drawable.beautifulgirl};*/ // 获得焦点时设定item Handler handler = new android.os.Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0) { setItemFocus(); } } }; private int scrolldeltady; private final int bluetext = getResources().getColor(R.color.btn_bule_text); private final int whitetext = getResources().getColor(R.color.white); public HorentialFocusRecycleView(Context context) { super(context); mContext = context; mRecycleView = HorentialFocusRecycleView.this; init(); } public HorentialFocusRecycleView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mContext = context; mRecycleView = HorentialFocusRecycleView.this; init(); } public HorentialFocusRecycleView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; mRecycleView = HorentialFocusRecycleView.this; init(); } private void init() { scrolldeltady = getResources().getDimensionPixelOffset(R.dimen.d_230dp); mLayoutManager = new LinearLayoutManager(mContext); mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); // 设定布局管理器 mRecycleView.setLayoutManager(mLayoutManager); // 设置适配器 mMyTabAdapter = new MyTabAdapter(); mRecycleView.setAdapter(mMyTabAdapter); // 设置间隔 mRecycleView.addItemDecoration(new ItemDecoration() { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) { super.getItemOffsets(outRect, view, parent, state); int spacingPixels = getResources().getDimensionPixelOffset(R.dimen.d_63dp); int position = parent.getChildPosition(view); if (position == 0) { //最左边的item 左间距为0 outRect.left = 0; } else if (position == tabsCount - 1) { outRect.left = spacingPixels; outRect.right = 0; } else { outRect.left = spacingPixels; } } }); // 要求RecycleView先于子控件获得焦点 mRecycleView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); mRecycleView.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean hasFocus) { if (hasFocus) { setItemFocus(); } } }); } public void setViewPos(int viewPos) { mViewPos = viewPos; } /** * 必须调用这个setData * SET后自动刷新 */ public void setData(String[] names, String[] uris) { if (names != null && uris != null) { this.names = names; this.uris = uris; } mMyTabAdapter.notifyDataSetChanged(); } public int getViewPos() { return mViewPos; } /** * 设置布局和变化的三个文件 *
* drawSelct0 -> item的默认样式
* drawSelct1 -> item被选中时带红框的样式
* drawSelct2 -> item选中后失去焦点的样式
*/
public void setLayoutAndDrawable(int itemLayout, Drawable drawSelct0, Drawable drawSelct1, Drawable drawSelct2) {
mItemLayout = itemLayout;
tabdefault = drawSelct0;
tabfocused = drawSelct1;
tabindicator = drawSelct2;
}
/**
* 初始化晃动动画实例
*/
private void initAnimation() {
shakeAnim = new TranslateAnimation(0, 0, 4, -4);
shakeAnim.setInterpolator(new OvershootInterpolator());
shakeAnim.setDuration(100);
shakeAnim.setRepeatCount(3);
shakeAnim.setRepeatMode(Animation.REVERSE);
}
/**
* tab栏上下获取焦点的视图
*
* @param
*/
public void setUpFocusView(View upFocusView) {
this.upFocusView = upFocusView;
}
public void setDownFocusView(View downFocusView) {
this.downFocusView = downFocusView;
}
public void setParentscroll(ScrollView parentscroll) {
this.parentscroll = parentscroll;
}
/**
* Recycleview之间focus失效,使用外部调用来识别失去焦点
*/
public void setLeaveTag() {
mLeaveTag = true;
}
private class MyTabAdapter extends RecyclerView.Adapter