private CountDownTimer mCountDownTimer;
private boolean mFlagInterceptPlay = false;
private int mFingerUpTime;
private List<BannerBean> mDatas = new ArrayList<>();
private ArrayList<ImageView> mIcons = new ArrayList<>();
private int previousSelectedPosition = 0;
@SuppressLint("ClickableViewAccessibility") private void itcast() {
mDatas.add(new BannerBean(R.drawable.start_indicator_1, "我的大刀早已饥渴难耐了"));
mDatas.add(new BannerBean(R.drawable.start_indicator_2, "敌军还有30秒到达战场"));
mDatas.add(new BannerBean(R.drawable.start_indicator_3, "你也想来一发嘛"));
mDatas.add(new BannerBean(R.drawable.start_indicator_4, "人在塔在"));
mBinding.vpAd.setOnTouchListener((view, motionEvent) -> {
switch(motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
mFlagInterceptPlay = true;
break;
case MotionEvent.ACTION_UP:
mFlagInterceptPlay = false;
mFingerUpTime = (int) System.currentTimeMillis();
break;
}
return false;
});
mBinding.vpAd.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
@Override public void onPageSelected(int position) {
int newPosition = position % mIcons.size();
mBinding.tvAdTitle.setText(mDatas.get(newPosition).getTitle());
mBinding.llPoints.getChildAt(previousSelectedPosition).setBackgroundResource(R.drawable.shape_package_indicator_normal);
mBinding.llPoints.getChildAt(newPosition).setBackgroundResource(R.drawable.shape_package_indicator_fouse);
previousSelectedPosition = newPosition;
}
@Override public void onPageScrollStateChanged(int state) { }
});
ImageView iv_icon;
View v_point;
LinearLayout.LayoutParams layoutParams;
for(int i = 0; i < mDatas.size(); i++) {
iv_icon = new ImageView(this);
iv_icon.setBackgroundResource(mDatas.get(i).getIcon());
mIcons.add(iv_icon);
v_point = new View(this);
layoutParams = new LinearLayout.LayoutParams(15, 15);
if(0 != i) layoutParams.leftMargin = 10;
v_point.setBackgroundResource(R.drawable.shape_package_indicator_normal);
mBinding.llPoints.addView(v_point, layoutParams);
}
mBinding.llPoints.getChildAt(0).setBackgroundResource(R.drawable.shape_package_indicator_fouse);
mBinding.tvAdTitle.setText(mDatas.get(0).getTitle());
mBinding.vpAd.setAdapter(new PagerAdapter() {
@Override public int getCount() {
return Integer.MAX_VALUE;
}
@Override public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override public Object instantiateItem(ViewGroup container, int position) {
int newPosition = position % mIcons.size();
ImageView iv = mIcons.get(newPosition);
container.addView(iv);
return iv;
}
@Override public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
});
mBinding.vpAd.setCurrentItem(Integer.MAX_VALUE / 2);
mCountDownTimer = new CountDownTimer(Integer.MAX_VALUE, 3_000) {
@Override public void onTick(long millisUntilFinished) {
if(! mFlagInterceptPlay && (int) System.currentTimeMillis() - mFingerUpTime > 3_000)
mBinding.vpAd.setCurrentItem(mBinding.vpAd.getCurrentItem() + 1);
}
@Override public void onFinish() { }
};
mCountDownTimer.start();
}
@Override protected void onDestroy() {
super.onDestroy();
if(null != mCountDownTimer) {
mCountDownTimer.cancel();
mCountDownTimer = null;
}
}
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.PagerSnapHelper;
import androidx.recyclerview.widget.RecyclerView;
public class RVBannerView extends FrameLayout {
@Override public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
playerCtrl(false);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
playerCtrl(true);
break;
}
return super.dispatchTouchEvent(event);
}
private final int MSG_AUTO_PLAY = -0x99;
private final int AUTO_PLAY_DURATION = 4_000;
private int mCurrentIndex;
@SuppressLint("HandlerLeak") private Handler mHandler = new Handler() {
@Override public void handleMessage(Message msg) {
if (msg.what == MSG_AUTO_PLAY) {
mRV.smoothScrollToPosition(++mCurrentIndex);
playerCtrl(true);
}
}
};
private RecyclerView mRV;
private RVBannerAdapter mAdapter;
private List<String> mDatas = new ArrayList<>();
public RVBannerView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mRV = new RecyclerView(getContext());
new PagerSnapHelper().attachToRecyclerView(mRV);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
mRV.setLayoutManager(layoutManager);
mRV.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
mCurrentIndex = layoutManager.findFirstVisibleItemPosition();
}
});
addView(mRV, new LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
}
public void play(List<String> datas, OnItemClickListener listener) {
mDatas = datas;
mAdapter = new RVBannerAdapter(mDatas, listener);
mRV.setAdapter(mAdapter);
mCurrentIndex = datas.size() * 10_000;
mRV.scrollToPosition(mCurrentIndex);
playerCtrl(true);
}
private void playerCtrl(boolean isStartPlay) {
if (isStartPlay) {
mHandler.sendEmptyMessageDelayed(MSG_AUTO_PLAY, AUTO_PLAY_DURATION);
} else {
mHandler.removeMessages(MSG_AUTO_PLAY);
}
}
public interface OnItemClickListener {
void onItemClick(int position);
void onItemLongClick(int position);
}
private class RVBannerAdapter extends RecyclerView.Adapter<RVBannerAdapter.ViewHolder> {
private List<String> mDatas;
private OnItemClickListener mListener;
RVBannerAdapter(List<String> datas, OnItemClickListener listener) {
mListener = listener;
mDatas = datas;
}
@NonNull @Override public RVBannerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new RVBannerAdapter.ViewHolder(new ImageView(parent.getContext()));
}
@Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
int realPosition = position % mDatas.size();
Glide.with(getContext()).load(mDatas.get(realPosition)).into(holder.iv);
if (null != mListener) {
holder.iv.setOnClickListener(v -> mListener.onItemClick(realPosition));
holder.iv.setOnLongClickListener(v -> {
mListener.onItemLongClick(realPosition);
return true;
});
}
}
@Override public int getItemCount() {
return Integer.MAX_VALUE;
}
class ViewHolder extends RecyclerView.ViewHolder {
private ImageView iv;
ViewHolder(@NonNull View itemView) {
super(itemView);
iv = (ImageView) itemView;
RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
iv.setLayoutParams(params);
iv.setScaleType(ImageView.ScaleType.FIT_XY);
}
}
}
}