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

更多相关文章

  1. 自定义PopupWindow动画效果
  2. Android(安卓)HorizontalScrollView回弹效果
  3. 关键字弹出动画
  4. 仿ios滚动 有弹性的ScrollView
  5. RecyclerView的canScrollVertically方法踩坑
  6. Property Anim详解
  7. Tween动画xml
  8. Android中Listview实现分页加载效果OnScrollListener
  9. 仿抖音视频详情页的红心点赞动效

随机推荐

  1. Android开机自启APK应用
  2. android linearlayout imageview置顶摆放
  3. android 编译源码 错误解决
  4. android常用数据库字段描述
  5. react native 修改Picker样式Android
  6. RelativeLayout用到的一些重要的属性
  7. Android中shape的使用
  8. Android系统框架基础
  9. Android移动开发之【Android实战项目】渐
  10. 推荐几个ListView下拉刷新