ViewFlipper实现View轮播点击等效果

来源:互联网 发布:centos python3 编辑:程序博客网 时间:2024/04/30 13:27
public class MagicViewFlipperLayout extends RelativeLayout implements View.OnTouchListener,Animation.AnimationListener {    private int[] imgRes;    private Context mcontext;    private ViewFlipper mviewflipper;    private List<listenerFunction> 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<listenerFunction> 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"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:fromXDelta="-100%"        android:toXDelta="0"        android:duration="300"></translate></set>
实现:
List<MagicViewFlipperLayout.listenerFunction> 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);
0 0
原创粉丝点击