ViewFlipper实现View轮播点击等效果
16lz
2021-01-26
public class MagicViewFlipperLayout extends RelativeLayout implements View.OnTouchListener,Animation.AnimationListener { private int[] imgRes; private Context mcontext; private ViewFlipper mviewflipper; private List listlistener = new ArrayList<>(); private GestureDetector gestureDetector = null; private static final int FLING_MIN_DISTANCE = 80; private static final int FLING_MIN_VELOCITY = 150; private LinearLayout layout; private Animation animin,animaout,animaleftin,animaleftout; private boolean autoflipping; public MagicViewFlipperLayout(Context context) { super(context); initView(context); } public MagicViewFlipperLayout(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public MagicViewFlipperLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context); } private void initView(Context context) { this.mcontext = context; animin = AnimationUtils.loadAnimation(mcontext, R.anim.img_in); animaout = AnimationUtils.loadAnimation(mcontext, R.anim.img_out); animaleftin = AnimationUtils.loadAnimation(mcontext, R.anim.img_in_left); animaleftout = AnimationUtils.loadAnimation(mcontext, R.anim.img_out_left); } @Override public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); } @Override public void onAnimationStart(Animation animation) { selectedPoint(); } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } public interface listenerFunction { void listf(); } /* * imgs:要放入的图片 * autoflipping:是否自动滚动 * flipinterval:滚动间隔时间 * listlistener:对应imgs的点击事件 * spotWidth:spot的宽度 * spotHeight:spot的高度 * paddingSize:spot间的间隔*/ public void startViewFlipper(int[] imgs,boolean autoflipping, int flipinterval, List listlistener,int spotWidth,int spotHeigt,int paddingSize) { this.listlistener = listlistener; this.imgRes = imgs; this.autoflipping = autoflipping; mviewflipper = new ViewFlipper(mcontext); if (listlistener.size() != imgRes.length) throw new UnsupportedOperationException("The number of listlistener is not equal the number of imgs"); for (int i = 0; i < imgRes.length; i++) { ImageView img = new ImageView(mcontext); img.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); img.setBackgroundResource(imgRes[i]); img.setScaleType(ImageView.ScaleType.CENTER); img.setTag(i); mviewflipper.addView(img); } mviewflipper.setInAnimation(animin); mviewflipper.setOutAnimation(animaout); // 开启自动启动并设置时间间隔 setViewFlipperToFlipping(autoflipping, true); mviewflipper.setFlipInterval(flipinterval); gestureDetector = new GestureDetector(mcontext, new GerstureListener()); animin.setAnimationListener(this); addView(mviewflipper); layout = new LinearLayout(mcontext); RelativeLayout.LayoutParams ll = new RelativeLayout.LayoutParams(spotWidth,spotHeigt); RelativeLayout.LayoutParams rlayout = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); rlayout.addRule(CENTER_HORIZONTAL); rlayout.addRule(ALIGN_PARENT_BOTTOM); ll.setMargins(0, 0, paddingSize, 20); layout.setLayoutParams(rlayout); for(int i = 0 ; i < imgRes.length ; i ++){ ImageView img = new ImageView(mcontext); img.setLayoutParams(ll); img.setImageResource(R.drawable.viewpager_spot); if(i == 0)img.setSelected(true); layout.addView(img); } addView(layout); setLongClickable(true); setOnTouchListener(this); mviewflipper.getInAnimation().setAnimationListener(this); } public void setViewFlipperToFlipping(boolean flipping,boolean startOrstop){ if(mviewflipper == null)return; if(flipping){ if(startOrstop){ mviewflipper.startFlipping(); }else{ mviewflipper.stopFlipping(); } } } private class GerstureListener implements GestureDetector.OnGestureListener { public boolean onDown(MotionEvent e) { return false; } public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { setViewFlipperToFlipping(autoflipping, false); if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) { // 左滑时,按照规定动画切换 mviewflipper.setInAnimation(animin); mviewflipper.setOutAnimation(animaout); mviewflipper.showNext(); } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) { // 右滑时,按照规定动画切换 mviewflipper.setInAnimation(animaleftin); mviewflipper.setOutAnimation(animaleftout); mviewflipper.showPrevious(); selectedPoint(); } setViewFlipperToFlipping(autoflipping,true); // 滑动动作完毕后,设置回右进左出的动画 mviewflipper.setInAnimation(animin); mviewflipper.setOutAnimation(animaout); return true; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub listlistener.get((int)mviewflipper.getCurrentView().getTag()).listf(); return true; } } private void selectedPoint(){ int i = (int)mviewflipper.getCurrentView().getTag(); for(int j = 0 ; j < layout.getChildCount();j++){ Log.i("ls", "i = " + i + " j = " + j); if(i == j){ layout.getChildAt(j).setSelected(true); }else{ layout.getChildAt(j).setSelected(false); } } }
动画example:
<?xml version="1.0" encoding="utf-8"?>
实现:
List listlistener = new ArrayList<>(); for(int i = 0; i < imgRes.length ; i ++){ final int finalI = i; MagicViewFlipperLayout.listenerFunction mlistener = new MagicViewFlipperLayout.listenerFunction() { @Override public void listf() { Toast.makeText(getActivity(), "" + imgRes[finalI], Toast.LENGTH_SHORT).show(); } }; listlistener.add(mlistener); } mViewPager.startViewFlipper(imgRes, true, 2000, listlistener, 28, 28,20);
更多相关文章
- 自定义PopupWindow动画效果
- Android(安卓)HorizontalScrollView回弹效果
- 关键字弹出动画
- 仿ios滚动 有弹性的ScrollView
- RecyclerView的canScrollVertically方法踩坑
- Property Anim详解
- Tween动画xml
- Android中Listview实现分页加载效果OnScrollListener
- 仿抖音视频详情页的红心点赞动效